Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在单元测试中测试广播接收机?_Android_Unit Testing - Fatal编程技术网

Android 如何在单元测试中测试广播接收机?

Android 如何在单元测试中测试广播接收机?,android,unit-testing,Android,Unit Testing,我需要在主线程上调用一个方法,为此,我使用@UiThreadTest并在测试中调用该方法。 该方法负责发送广播接收器。 因此,我正在注册接收器并设置一个布尔值来测试广播是否已发送。 在日志中,我可以看到广播被执行。 但在测试中获取断言失败错误。 这是线程问题吗 //宽幅接收机 private class Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, fin

我需要在主线程上调用一个方法,为此,我使用@UiThreadTest并在测试中调用该方法。 该方法负责发送广播接收器。 因此,我正在注册接收器并设置一个布尔值来测试广播是否已发送。 在日志中,我可以看到广播被执行。 但在测试中获取断言失败错误。 这是线程问题吗

//宽幅接收机

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);


    }