我正在使用 ServiceTestCase 为服务编写单元测试。
该服务基本上执行一个 AsyncTask,它做一些工作,然后在 onPostExecute() 中做一些其他事情。
当我在(虚拟)设备中运行和调试它时,该服务按预期工作。
但是在扩展 ServiceTestCase 的测试中,我只进入了 doInBackground()。一旦方法返回, onPostExecute() 就永远不会被调用。我让测试 sleep() 所以 AsyncTask 有时间完成它的工作。
这是简化的服务:
public class ServiceToTest extends Service {
private AtomicBoolean busy = new AtomicBoolean(false);
@Override
public IBinder onBind(final Intent intent) {
return null;
}
@Override
public int onStartCommand(final Intent intent, final int flags,
final int startId) {
this.handleCommand();
return START_NOT_STICKY;
}
/**
* Workaround for http://code.google.com/p/android/issues/detail?id=12117
*/
@Override
public void onStart(final Intent intent, final int startId) {
this.handleCommand();
}
public void handleCommand() {
new TaskToTest().execute();
}
public boolean isBusy() {
return busy.get();
}
private class TaskToTest extends AsyncTask<Boolean, Void, TestInfo> {
@Override
protected void onPreExecute() {
busy.set(true);
}
@Override
protected TestInfo doInBackground(final Boolean... args) {
return null;
}
@Override
protected void onPostExecute(final TestInfo info) {
busy.set(false);
}
}
}
这是对它的测试:
public class ServiceTest extends ServiceTestCase<ServiceToTest> {
public ServiceTest() {
super(ServiceToTest.class);
}
public void testIsBusy() throws InterruptedException {
startService(new Intent("this.is.the.ServiceToTest"));
ServiceToTest serviceToTest = this.getService();
assertTrue(serviceToTest.isBusy());
Thread.sleep(10000);
assertFalse(serviceToTest.isBusy());
}
}
我想 ServiceTestCase 提供的环境有些有限,所以这不起作用,但是我能做些什么让它工作吗?
干杯,托斯滕