如何JUnit测试IntentService(how to JUnit test IntentSer

2019-09-21 03:30发布

我是新进的Android测试,我想测试一个IntentService和我目前扩大ServiceTestCase。

我试图用一个ResultReceiver但问题是, OnReceiveResult从未测试用例中调用。 (我也尝试创建ResultReceivernew Handler()作为参数insetad null ,但具有相同的结果。

我究竟做错了什么? 什么是测试一个正确的方法IntentService

这是服务:

public class MyService extends IntentService {

public MyService() {
    super("MyService");
}

public MyService(String name) {
    super(name);
}

@Override
protected void onHandleIntent(Intent intent) {
    final int action = intent.getIntExtra("action", 0);
    final int request = intent.getIntExtra("request", 0);
    final ResultReceiver receiver = (ResultReceiver) intent.getExtras().get("receiver");

    if (receiver == null) {
        return;
    }

    if (action == 0 || request == 0) {
        receiver.send(0, null);

        return;
    }
}

}

这是测试:

public void testHandleInvalidRequests() {
    ResultReceiver receiver = new ResultReceiver(null) {
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            fail();
        }   
    };

    Intent intent = new Intent(mContext, MyService.class);
    intent.putExtra("receiver", receiver);
    startService(intent);

}

Answer 1:

我成功地设法测试我IntentService ,我会概念告诉你我是如何做的。

首先,扩展了Android服务测试类: ServiceTestCase<MyIntentService> 然后,你基本上开始IntentService像你一样使用startService(intent)

由于被测服务是IntentService ,它会做一个生成的辅助线程的所有工作。 如果你不阻止你的测试线程那么你的测试方法会立即做断言,因为在后台的测试工作可能尚未完成,这将明显失败。 最终,测试方法将返回和你的测试将失败。

什么,你需要做的是阻止后您的测试线程startService 。 做到这一点使用ReentrantLock和条件调用await()就可以了。

IntentService然后执行onHandleIntent的背景。 我建议您延长IntentService并覆盖onHandleIntent ,调用super.onHandleIntent()之后,信号测试线程的工作已经完成。 做这在用于封闭测试线相同的锁和条件。



Answer 2:

如果startService()的测试文件扩展ServiceTestCase<>我在Android Studio中1.1的试验设施,已经找到ServiceTestCase不实例化一个IntentService通过对象onHandleIntent()
见的Android ServiceTestCase为IntentService获取更多信息。



Answer 3:

我知道这是旧的,但我有同样的问题,我会怎样,我终于成功地运行一个测试在这里发表IntentService 。 作为@Joerg说,这是一个线程问题。

public class MyServiceTest extends ServiceTestCase<MyService> {
    public MyServiceTest() {
        super(MyService.class);
    }

    public void testOnHandleIntent() throws Exception {
        Looper.prepare();
        final CountDownLatch latch = new CountDownLatch(1);

        ResultReceiver receiver = new ResultReceiver(new Handler()) {
            @Override
            protected void onReceiveResult(int resultCode, Bundle resultData) {
                latch.countDown();

                assertEquals(resultCode, 0);
                assertNull(resultData);
                fail();

                Looper.myLooper().quit();
            }
        };

        Intent intent = new Intent(getSystemContext(), MyService.class);
        intent.putExtra("receiver", receiver);
        getSystemContext().startService(intent);

        Looper.loop();

        assertThat(latch.getCount(), is(0L));
    }
}

LooperHandler类是必要的,这样的回调有一个线程中调用的。 闩锁是有仅作为锁定的示例,并且作为一种手段来断言测试方法结束之前由回调传递的代码。

如果quit()的方法Looper不叫,测试挂起。

ServiceTestCase不赞成在Android的最新版本,但更换( ServiceTestRule )不支持IntentService ...



文章来源: how to JUnit test IntentService