【发布时间】:2012-07-26 20:14:54
【问题描述】:
使用 Robolectric,如何测试将 IntentService 广播为响应的 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 来验证广播是否有效。有什么想法吗?
【问题讨论】:
-
我没有适合您的具体解决方案,但我认为您必须使用 mockito 模拟广播接收器才能在您的代码中调用 onReceive。或者更简单的方法是将 onReceive 中的逻辑提取到单独的测试用例中。
-
广播接收器实际上工作得很好。正如我在上面帖子底部所说,调用 context.sendBroadcast 会进入 onReceive。这是我看不到发生的服务初始化。
-
您找到解决方案了吗?我在尝试测试
IntentService时遇到了同样的问题
标签: android unit-testing broadcastreceiver intentservice robolectric