Я пишу модульный тест для службы, используя 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, несколько ограничена, так что это не работает, но могу ли я что-нибудь сделать, чтобы она заработала?
Cheers,
Торстен