也许我漏掉了什么。我想为一个BroadcastReceiver编写测试用例;具体来说,是为接收BOOT_COMPLETED事件并设置警报以供另一个接收器稍后处理而编写的。它似乎没有正确设置,但关键是我没有明显的方法来测试它。我无法附加调试器并等待BOOT_COMPLETED事件,也无法发送虚假的BOOT_COMPLETED广播。
为什么Activity、Service和Provider有Instrumentation类,而BroadcastReceiver没有呢?对于测试此问题,有何建议吗?
也许我漏掉了什么。我想为一个BroadcastReceiver编写测试用例;具体来说,是为接收BOOT_COMPLETED事件并设置警报以供另一个接收器稍后处理而编写的。它似乎没有正确设置,但关键是我没有明显的方法来测试它。我无法附加调试器并等待BOOT_COMPLETED事件,也无法发送虚假的BOOT_COMPLETED广播。
为什么Activity、Service和Provider有Instrumentation类,而BroadcastReceiver没有呢?对于测试此问题,有何建议吗?
广播接收器的生命周期并没有什么神奇之处。使用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
}
}
AndroidTestCase
不合适(可能会导致意外结果)。特别是,如果您正在进行更复杂的集成测试,并且希望使用由系统发送的实际Intent
测试您的BroadcastReceiver
。主要原因是广播接收器中的onReceive
方法在主应用程序线程上运行,而在AndroidTestCase
中运行测试的另一个线程中运行。这可能会在未经过多线程处理的代码中引起与测试相关的线程问题。InstrumentationTestCase
中子类化测试,然后使用@UiThreadTest
注释使测试在与onReceive
方法相同的线程上运行。