为什么BroadcastReceiver没有测试工具?

时间:2010-11-01 23:34:20

标签: android testing tdd broadcastreceiver instrumentation

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

为什么有Activity,Service和Provider的检测类,而不是BroadcastReceiver?有关测试的建议吗?

2 个答案:

答案 0 :(得分:18)

BroadcastReceiver的生命周期没有什么神奇之处。用AndroidTestCase测试它就足够了。在测试用例中,实例化您的BroadcastReceiver,创建您想要发送的任何Intent,并使用AndroidTestCase提供的Context或一些模拟上下文调用onReceive。

E.g。

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
  }
}

答案 1 :(得分:7)

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

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

对此的解决方案是从InstrumentationTestCase继承您的测试,并使用@UiThreadTest注释使测试在与onReceive方法相同的线程上运行。

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