为什么 BroadcastReceiver 没有测试工具?

13

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

为什么Activity、Service和Provider有Instrumentation类,而BroadcastReceiver没有呢?对于测试此问题,有何建议吗?

2个回答

21

广播接收器的生命周期并没有什么神奇之处。使用AndroidTestCase进行测试就足够了。在测试用例中,实例化你的广播接收器,创建你想要发送的Intent并使用AndroidTestCase提供的Context或模拟Context调用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
  }
}

简单而有效! - Robert

7
对于大多数情况,我完全同意https://dev59.com/j2855IYBdhLWcg3w7o-g#5181010
然而,在某些情况下,扩展AndroidTestCase不合适(可能会导致意外结果)。特别是,如果您正在进行更复杂的集成测试,并且希望使用由系统发送的实际Intent测试您的BroadcastReceiver。主要原因是广播接收器中的onReceive方法在主应用程序线程上运行,而在AndroidTestCase中运行测试的另一个线程中运行。这可能会在未经过多线程处理的代码中引起与测试相关的线程问题。
解决方案是从InstrumentationTestCase中子类化测试,然后使用@UiThreadTest注释使测试在与onReceive方法相同的线程上运行。
有关更多信息(及示例),请参见:http://olafurhelgason.blogspot.com/2012/12/threading-and-android-integration.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接