我是新进的Android测试,我想测试一个IntentService和我目前扩大ServiceTestCase。
我试图用一个ResultReceiver
但问题是, OnReceiveResult
从未测试用例中调用。 (我也尝试创建ResultReceiver
与new 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);
}
我成功地设法测试我IntentService
,我会概念告诉你我是如何做的。
首先,扩展了Android服务测试类: ServiceTestCase<MyIntentService>
然后,你基本上开始IntentService
像你一样使用startService(intent)
。
由于被测服务是IntentService
,它会做一个生成的辅助线程的所有工作。 如果你不阻止你的测试线程那么你的测试方法会立即做断言,因为在后台的测试工作可能尚未完成,这将明显失败。 最终,测试方法将返回和你的测试将失败。
什么,你需要做的是阻止后您的测试线程startService
。 做到这一点使用ReentrantLock
和条件调用await()
就可以了。
该IntentService
然后执行onHandleIntent
的背景。 我建议您延长IntentService
并覆盖onHandleIntent
,调用super.onHandleIntent()
之后,信号测试线程的工作已经完成。 做这在用于封闭测试线相同的锁和条件。
如果startService()
的测试文件扩展ServiceTestCase<>
我在Android Studio中1.1的试验设施,已经找到ServiceTestCase
不实例化一个IntentService
通过对象onHandleIntent()
见的Android ServiceTestCase为IntentService获取更多信息。
我知道这是旧的,但我有同样的问题,我会怎样,我终于成功地运行一个测试在这里发表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));
}
}
该Looper
和Handler
类是必要的,这样的回调有一个线程中调用的。 闩锁是有仅作为锁定的示例,并且作为一种手段来断言测试方法结束之前由回调传递的代码。
如果quit()
的方法Looper
不叫,测试挂起。
ServiceTestCase
不赞成在Android的最新版本,但更换( ServiceTestRule
)不支持IntentService
...