Android 为什么广播接收机没有测试仪器?
也许我错过了什么。我想为广播接收机编写测试用例;具体来说,它用于接收BOOT_COMPLETED事件,并设置一个警报供另一个接收器稍后处理;它似乎没有设置正确,但关键是我没有明显的方法来测试它。我不能完全附加调试器并等待启动完成,也不能发送虚假的启动完成广播Android 为什么广播接收机没有测试仪器?,android,testing,tdd,broadcastreceiver,instrumentation,Android,Testing,Tdd,Broadcastreceiver,Instrumentation,也许我错过了什么。我想为广播接收机编写测试用例;具体来说,它用于接收BOOT_COMPLETED事件,并设置一个警报供另一个接收器稍后处理;它似乎没有设置正确,但关键是我没有明显的方法来测试它。我不能完全附加调试器并等待启动完成,也不能发送虚假的启动完成广播 为什么有针对活动、服务和提供者的插装类,而没有针对广播接收者的插装类?关于测试这一点有什么建议吗?广播接收器的生命周期没有什么神奇之处。用AndroidTestCase测试就足够了。在测试用例中,实例化您的BroadcastReceiver
为什么有针对活动、服务和提供者的插装类,而没有针对广播接收者的插装类?关于测试这一点有什么建议吗?广播接收器的生命周期没有什么神奇之处。用AndroidTestCase测试就足够了。在测试用例中,实例化您的BroadcastReceiver,使用AndroidTestCase提供的上下文或一些模拟上下文创建您想要发送和调用onReceive的任何意图 例如
在大多数情况下,我完全同意 但是,在某些情况下,扩展
AndroidTestCase
是不合适的(并且可能会引起意外)。特别是,如果您正在进行更复杂的集成测试,并且希望使用系统发送的实际意图
测试您的广播接收器
。主要原因是广播接收器中的onReceive
方法在主应用程序线程上运行,而AndroidTestCase
中的测试在另一个线程中运行。这可能会在不打算在多个线程上运行的代码中导致与测试相关的线程问题
解决方法是从InstrumentationTestCase
中为测试子类化,并使用@UiThreadTest
注释使测试与onReceive
方法在同一线程上运行
有关更多信息(以及示例),请参阅:Simple and does the job!
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
}
}