使用Robolectric,如何测试一个广播意图作为响应的IntentService?
假设以下课程:
class MyService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("action"));
}
}
在我的测试用例中,我试图做这样的事情:
@RunWith(RobolectricTestRunner.class)
public class MyServiceTest{
@Test
public void testPurchaseHappyPath() throws Exception {
Context context = new Activity();
// register broadcast receiver
BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// test logic to ensure that this is called
}
};
context.registerReceiver(br, new IntentFilter("action"));
// This doesn't work
context.startService(new Intent(context, MyService.class));
}
}
MyService从未使用此方法启动。我对Robolectric比较陌生,所以我可能会遗漏一些明显的东西。在调用startService之前是否需要进行某种绑定?我已经通过在上下文中调用sendBroadcast验证了广播的工作原理。有什么想法吗?
答案 0 :(得分:11)
您无法像尝试那样测试服务初始化。当您在Robolectric下创建新活动时,您获得的活动实际上是ShadowActivity
(种类)。这意味着当您致电startService
时,实际执行的方法是this one,它只会调用ShadowApplication#startService
。这是该方法的内容:
@Implementation
@Override
public ComponentName startService(Intent intent) {
startedServices.add(intent);
return new ComponentName("some.service.package", "SomeServiceName-FIXME");
}
您会注意到它实际上并没有尝试启动您的服务。它只是说明您尝试启动该服务。这对于某些受测试代码应该启动服务的情况很有用。
如果要测试实际服务,我认为您需要模拟初始化位的服务生命周期。这样的事情可能有用:
@RunWith(RobolectricTestRunner.class)
public class MyServiceTest{
@Test
public void testPurchaseHappyPath() throws Exception {
Intent startIntent = new Intent(Robolectric.application, MyService.class);
MyService service = new MyService();
service.onCreate();
service.onStartCommand(startIntent, 0, 42);
// TODO: test test test
service.onDestroy();
}
}
我不熟悉Robolectric如何处理BroadcastReceiver
,所以我把它留了出来。
编辑:在JUnit @Before
/ @After
方法中进行服务创建/销毁可能更有意义,这将允许您的测试仅包含{ {1}}和“测试测试”位。