我是 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/