我正在使用ServiceTestCase为服务编写单元测试。
服务基本上执行一个异步任务,该任务执行一些工作,然后在onPostExecute()中执行其他工作。
当我在(虚拟)设备中运行和调试该服务时,它会按预期工作。
但是在测试扩展servicetestcase中,我只进入doinbackground()。一旦方法返回,onPostExecute()就永远不会被调用。我让测试休眠(),这样异步任务就有时间完成它的工作。
这是简化服务:

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提供的环境有点有限,所以这不起作用,但是我能做些什么来让它起作用吗?
干杯,
托尔斯滕

最佳答案

问题是,您的后台线程正在等待ui“活动”,您需要调用Looper.prepare()Looper.loop()。最好在this page中解释。

09-08 03:08