我目前正在为一个android应用程序编写单元测试,并遇到了以下问题:
我使用ServiceTestCase测试IntentService,如下所示:
@Override
public void setUp() throws Exception {
super.setUp();
}
public void testService()
{
Intent intent = new Intent(getSystemContext(), MyIntentService.class);
super.startService(intent);
assertNotNull(getService());
}然而,我注意到我的IntentService被创建了(意味着调用了onCreate ),但我从未收到对onHandleIntent(Intent intent)的调用
有没有人已经用ServiceTestCase类测试过IntentService?
谢谢!
发布于 2011-08-12 21:48:41
我刚刚开始测试我自己的IntentService,事实证明这有点令人头疼。
我仍然在尝试解决问题,但是对于您似乎没有收到对方法onHandleIntent()的调用的情况(我对junit背后的技术细节不是很在行,所以请原谅我使用的术语),这应该是因为测试框架实际上是基于您的代码,一旦您对startService的调用返回,测试框架就会终止或终止测试方法。没有足够的时间触发onHandleIntent。
我在我的测试用例中添加了一个无限循环,从而验证了上述理论-只有这样,我才能在记录的onHandleIntent中看到我的日志语句。
发布于 2013-10-24 05:06:18
这有点晚了,但我只是为此而挣扎。您可以通过创建一个简单地覆盖服务的onStart的类来解决这个问题,这样它就可以直接调用onHandleIntent。因此,例如,如果您有一个LocationUpdaterService,您可以创建一个伪类来覆盖onStart函数,如下所示:
public class LocationUpdaterServiceFake extends LocationUpdaterService {
@Override
public void onStart(Intent intent, int startId) {
onHandleIntent(intent);
stopSelf(startId);
}LocationUpdaterService是IntentService的子类,所以在编写测试时,只需像这样使用LocationUpdaterServiceFake类
public class LocationUpdateServiceTest extends ServiceTestCase<LocationUpdaterServiceFake> {
public LocationUpdateServiceTest()
{
super(LocationUpdaterServiceFake.class);
}
public void testNewAreaNullLocation()
{
Intent intent = new Intent();
intent.setAction(LocationUpdaterService.ACTION_NEW_AREA);
startService(intent);
}}
现在,无论何时调用startService,它都会绕过IntentService中的线程代码,只调用onHandleIntent函数
发布于 2013-07-04 23:07:51
你只需要添加一个:
Thread.sleep(XXXXXXX); 在startService之后选择XXXX,然后它会让线程进入onHandleIntent方法。
https://stackoverflow.com/questions/6667087
复制相似问题