IntentService的Android ServiceTestCase

Dom*_*erg 11 android servicetestcase

我目前正在为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());        
}
Run Code Online (Sandbox Code Playgroud)

但是我注意到我IntentService的创建(意味着onCreate被调用),但我从未接到过调用onHandleIntent(Intent intent)

有人已经IntentServiceServiceTestCase课堂上测试了吗?

谢谢!

Mat*_*t J 6

这有点晚了,但我只是在努力解决这个问题.您可以通过创建一个简单地覆盖服务的onStart的类来解决这个问题,onHandleIntent直接调用它.例如,如果你有一个LocationUpdaterService,你可以创建一个伪类来覆盖这个onStart函数,如下所示:

public class LocationUpdaterServiceFake extends LocationUpdaterService {

@Override
public void onStart(Intent intent, int startId) {
    onHandleIntent(intent);
    stopSelf(startId);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

}

现在无论何时打电话startService,它都会绕过IntentService中的线程代码,只需调用你的onHandleIntent函数即可


yjw*_*yjw 2

我刚刚开始测试自己的测试IntentService,事实证明这有点令人头疼。

仍在尝试解决问题,但对于您似乎没有收到对您的方法的调用的情况onHandleIntent(),(我不太了解背后的技术细节junit,所以请原谅我使用术语)这应该是因为测试框架,根据您的代码,一旦您的调用startService返回,实际上会拆除或结束测试方法。没有足够的时间来onHandleIntent触发。

我通过在测试用例中添加无限循环来验证上述理论 - 只有这样我才能在onHandleIntent记录中看到我的日志语句。