asyncTask测试不执行

时间:2014-10-10 02:09:04

标签: android robolectric

我使用robolectric来测试我的AsyncTask类。在测试中,它完成了我在运行任务时的期望:

asyncTask.execute()

但是当我做的时候

asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)

它没有(在两个实例中我都运行

Robolectric.runUiThreadTasksIncludingDelayedTasks()

任何人都知道为什么调用executeOnExecutor并不会触发Robolectric运行但执行正常?

1 个答案:

答案 0 :(得分:12)

Robolectric框架不能与默认执行程序(即AsyncTask.THREAD_POOL_EXECUTOR或AsyncTask.SERIAL_EXECUTOR)一起开箱即用,也不能与自定义执行器一起使用。

要解决此问题,您可以采用这两种方法之一,具体取决于您是否可以控制被测单元使用的执行程序。如果答案为是,则第一种方法是简单地使用RoboExecutorService(或者如果使用3.0以下的版本 - RobolectricBackgroundExecutorService)。否则,您将采用不同的方法来应用这两步解决方法:

定义自定义AsyncTask阴影

您需要做的第一件事是实现一个覆盖自定义执行程序执行的AsyncTask影子:

@Implements(AsyncTask.class)
public class MyShadowAsyncTask<Params, Progress, Result> extends ShadowAsyncTask<Params, Progress, Result> {

    @Implementation
    public AsyncTask<Params, Progress, Result> executeOnExecutor(Executor executor, Params... params) {
        return super.execute(params);
    }       
}

注册自定义阴影

在运行使用AsyncTask#executeOnExecutor()的生产代码的每个测试用例中,注册您的自定义阴影以覆盖Robolectric的默认值,这样(查看'config'注释):

@RunWith(RobolectricTestRunner.class)
@Config(shadows={MyShadowAsyncTask.class})
public class MyTest {
    // ... test code
}

Robolectric.runUiThreadTasks()Robolectric.runUiThreadTasksIncludingDelayedTasks()的后续调用将按预期工作(即阻止运行程序线程直到异步任务完成)。