代码之家  ›  专栏  ›  技术社区  ›  sosiouxme

为什么广播接收机没有测试仪器?

  •  11
  • sosiouxme  · 技术社区  · 14 年前

    也许我错过了什么。我想为一个广播接收器编写测试用例;具体来说,它是为了接收引导完成的事件并设置一个警报以便另一个接收器稍后处理;它似乎没有正确设置,但重点是我没有明显的方法来测试它。我无法准确地附加调试程序并等待引导完成,也无法发送假引导完成广播。

    为什么有活动、服务和提供者的工具类,而不是广播接收器?测试这个有什么建议吗?

    2 回复  |  直到 14 年前
        1
  •  18
  •   David Burström    14 年前

    广播接收器的生命周期没有什么神奇的。用一个AndroidTestCase来测试就足够了。在测试用例中,实例化您的BroadcastReceiver,创建您想要发送的任何意图,并使用AndroidTestCase或一些模拟上下文提供的上下文调用OnReceive。

    例如。

    public class TestMyBroadcastReceiver extends AndroidTestCase {
      public void testReceive() {
        MyBroadcastReceiver r = new MyBroadcastReceiver();
        Intent i = new Intent("MY_ACTION");
        // TODO put extras
        r.onReceive(getContext(), i);
        // TODO query application state to verify results
      }
    }
    
        2
  •  7
  •   Community CDub    8 年前

    在大多数情况下,我完全同意 https://stackoverflow.com/a/5181010/527016

    但是,在扩展 AndroidTestCase 不适合(并可能导致意外)。尤其是,如果您正在进行更复杂的集成测试,并且希望测试 BroadcastReceiver 与实际 Intent 由系统发送。主要原因是 onReceive 广播接收器中的方法在主应用程序线程上运行,而测试在 仙女座试验箱 在另一个线程中运行。这可能会导致代码中与测试相关的线程问题,这些问题不打算在多个线程上运行。

    解决方法是从 InstrumentationTestCase 而是使用 @UiThreadTest 使测试在与 接收时 方法。

    有关详细信息(和示例),请参见: http://olafurhelgason.blogspot.com/2012/12/threading-and-android-integration.html