我使用robolectric来测试我的AsyncTask类。在测试中,它完成了我在运行任务时的期望:
asyncTask.execute()
但是当我做的时候
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
它没有(在两个实例中我都运行
Robolectric.runUiThreadTasksIncludingDelayedTasks()
任何人都知道为什么调用executeOnExecutor并不会触发Robolectric运行但执行正常?
答案 0 :(得分:12)
Robolectric框架不能与默认执行程序(即AsyncTask.THREAD_POOL_EXECUTOR或AsyncTask.SERIAL_EXECUTOR)一起开箱即用,也不能与自定义执行器一起使用。
要解决此问题,您可以采用这两种方法之一,具体取决于您是否可以控制被测单元使用的执行程序。如果答案为是,则第一种方法是简单地使用RoboExecutorService(或者如果使用3.0以下的版本 - RobolectricBackgroundExecutorService)。否则,您将采用不同的方法来应用这两步解决方法:
您需要做的第一件事是实现一个覆盖自定义执行程序执行的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()
的后续调用将按预期工作(即阻止运行程序线程直到异步任务完成)。