也许我错过了什么。我想为BroadcastReceiver编写测试用例;具体来说,它是用于接收BOOT_COMPLETED事件并为另一个接收器设置警报以便稍后处理;它似乎没有正确设置,但重点是我没有明显的方法来测试它。我无法完全附加调试器并等待BOOT_COMPLETED,我无法发送假的BOOT_COMPLETED广播。
为什么有Activity,Service和Provider的检测类,而不是BroadcastReceiver?有关测试的建议吗?
答案 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