Android 如何在单元测试中测试广播接收机?
我需要在主线程上调用一个方法,为此,我使用@UiThreadTest并在测试中调用该方法。 该方法负责发送广播接收器。 因此,我正在注册接收器并设置一个布尔值来测试广播是否已发送。 在日志中,我可以看到广播被执行。 但在测试中获取断言失败错误。 这是线程问题吗 //宽幅接收机Android 如何在单元测试中测试广播接收机?,android,unit-testing,Android,Unit Testing,我需要在主线程上调用一个方法,为此,我使用@UiThreadTest并在测试中调用该方法。 该方法负责发送广播接收器。 因此,我正在注册接收器并设置一个布尔值来测试广播是否已发送。 在日志中,我可以看到广播被执行。 但在测试中获取断言失败错误。 这是线程问题吗 //宽幅接收机 private class Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, fin
private class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, final Intent intent) {
if (mUiUpdateReceiver != null && intent.getAction().equals(MessageCenter.INTENT_UI_REFRESH)) {
mbroadcastFlag = true;
}
}
}
//试验
@UiThreadTest
public void test_broadcast () throws Exception{
mUiUpdateReceiver = new Receiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SampleClass.INTENT_REFRESH);
LocalBroadcastManager.getInstance(mAppContext).registerReceiver(mUiUpdateReceiver, intentFilter);
mbroadcastFlag = false;
sampleClass.method();
Thread.sleep(2000);
assertTrue(mbroadcastFlag);
LocalBroadcastManager.getInstance(mAppContext).unregisterReceiver(mUiUpdateReceiver);
}
我为你们写了一个带有广播接收器和单元测试的小hello world 这是我的广播接收器:
public class UiRefreshReceiver extends BroadcastReceiver {
boolean broadcastFlag;
public UiRefreshReceiver() {}
@Override
public void onReceive(Context context, Intent intent) {
broadcastFlag = true;
}
}
和它的测试类:
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
@UiThreadTest
public void test_broadcast () throws Exception{
UiRefreshReceiver mUiUpdateReceiver = new UiRefreshReceiver();
LocalBroadcastManager.getInstance(getContext()).registerReceiver(mUiUpdateReceiver, new IntentFilter("my-event"));
assertFalse(mUiUpdateReceiver.broadcastFlag);
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(new Intent("my-event"));
Thread.sleep(2000);
assertTrue(mUiUpdateReceiver.broadcastFlag);
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mUiUpdateReceiver);
}
}
公共类ApplicationTest扩展了ApplicationTestCase{
公共应用程序测试(){
super(Application.class);
}
@超线程测试
public void test_broadcast()引发异常{
UiRefreshReceiver mUiUpdateReceiver=新UiRefreshReceiver();
LocalBroadcastManager.getInstance(getContext()).registerReceiver(mUiUpdateReceiver,新的IntentFilter(“我的事件”);
assertFalse(mUiUpdateReceiver.broadcastFlag);
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(新意图(“我的事件”));
《睡眠》(2000年);
assertTrue(mUiUpdateReceiver.broadcastFlag);
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mUiUpdateReceiver);
}
}
我希望这会有帮助
不过,在我看来,简单地对receive()代码进行单元测试就足够了。Konstantin Loginov的answear还可以,但它使用JUnit3(因为他扩展了ApplicationTestCase;如果扩展了任何测试用例类,Android框架将默认使用JUnit3 runner运行测试) 如果要使用较新的JUnit 4,可以使用以下内容:
public class MyReceiver extends BroadcastReceiver {
boolean flag;
@Override
public void onReceive(Context context, Intent intent) {
Uri packageName = intent.getData();
if(packageName.toString().equals("package:" + context.getPackageName())){
flag = true;
}
}
}
而测试本身:
public class MyReceiverTest {
Context context;
@Before
public void init() {
context = new RenamingDelegatingContext(InstrumentationRegistry.getInstrumentation().getTargetContext(), "test_");
}
@Test
public void myReceiverTest() throws InterruptedException {
MyReceiver receiver = new MyReceiver();
//remeber to change Intent.ACTION_PACKAGE_REPLACED
//with your action name from your mainfest file
LocalBroadcastManager.getInstance(context).registerReceiver(receiver, new IntentFilter(Intent.ACTION_PACKAGE_REPLACED));
String pn = context.getPackageName();
Intent i = new Intent(Intent.ACTION_PACKAGE_REPLACED);
i.setData(Uri.parse("package:" + context.getPackageName()));
LocalBroadcastManager.getInstance(context).sendBroadcast(i);
Thread.sleep(2000);
boolean b = receiver.flag;
assertTrue(b);
LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
assertTrue(true);
}