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覆盖自定义执行程序执行的阴影:
@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()将按预期工作(即,将阻止运行程序线程直到异步任务完成).
| 归档时间: |
|
| 查看次数: |
2691 次 |
| 最近记录: |