java - JUnit如何测试IntentService

标签 java android junit android-testing

我是 Android 测试的新手,我想测试一个 IntentService,我目前正在扩展 ServiceTestCase。

我正在尝试使用 ResultReceiver,但问题是 OnReceiveResult 从未在测试用例中调用。 (我还尝试使用 new Handler() 作为 null 的参数 insetad 创建 ResultReceiver,但结果相同。

我做错了什么? 测试 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);

}

最佳答案

我成功地测试了我的 IntentService我将从概念上向您展示我是如何做到的。

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

由于被测服务是 IntentService ,它将在生成的工作线程中完成所有工作。如果您不阻塞您的测试线程,那么您的测试方法将立即执行显然会失败的断言,因为后台的测试工作可能尚未完成。最终,测试方法将返回,您的测试将失败。

您需要做的是在startService 之后阻塞您的测试线程。 .使用 ReentrantLock 执行此操作和一个调用 await() 的条件在上面。

IntentService然后执行 onHandleIntent在后台。我建议你延长你的 IntentService并覆盖 onHandleIntent , 调用 super.onHandleIntent()之后,向您的测试线程发出信号,表明工作已经完成。在用于阻止测试线程的相同锁和条件上执行此操作。

关于java - JUnit如何测试IntentService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923181/

相关文章:

java - 即使计算正确,方法仍返回 NaN

java - 在 Windows LAF 下为每个组件的 JTextField 设置非 Activity 背景颜色

java - 在 Java 中查找最左/最右未设置位的索引的最有效方法是什么?

javascript - Android 浏览器在鼠标按下 1 秒后长时间按住禁用/鼠标松开

java - 如何正确测试此方法?(junit)

java - 将对象设置为null以及Java中的程序流程

java - 在 Android 中发送 POST 数据

android - 什么是 Dalvik 和 dalvik-cache?

java - 如何让两个对象相等通过assertEquals()?

java - 为什么我在这里收到 InvalidUseOfMatchersException?