asyncTask测试不执行

Ake*_*eem 7 android robolectric

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

asyncTask.execute()
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做

asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
Run Code Online (Sandbox Code Playgroud)

它没有(在两个实例中我都跑了

Robolectric.runUiThreadTasksIncludingDelayedTasks()
Run Code Online (Sandbox Code Playgroud)

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

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

注册自定义阴影

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

@RunWith(RobolectricTestRunner.class)
@Config(shadows={MyShadowAsyncTask.class})
public class MyTest {
    // ... test code
}
Run Code Online (Sandbox Code Playgroud)

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