我最近开始使用 Robolectric 对我的一些 Android 应用程序进行单元测试,并且偶然发现了一个问题。在一些地方,我使用 AsyncTasks 进行一些后台计算,然后根据这些计算的结果更新 UI。如果我使用 execute()
执行 AsyncTask,当我运行测试以检查 UI 是否已正确更新时,它会通过。但是,出于各种原因,我实际上是在使用带有 THREAD_POOL_EXECUTOR
参数的 exectueOnExecutor()
。当我用它运行测试时,测试失败并认为 UI 尚未更新。同样,如果我从一个线程执行此操作并发回 UI 线程,我也会遇到同样的问题。有什么办法解决这个问题吗?
最佳答案
经过几个小时的搜索this线程帮助我解决了我的问题。
在简单的步骤中,您必须创建一个新类,该类将隐藏正在使用 executeOnExecutor()
的 AsyncTasks,因为 Robolectric 框架中似乎存在错误。这是上述线程中的示例:
@Implements(AsyncTask.class)
public class MyShadowAsyncTask<Params, Progress, Result> extends ShadowAsyncTask<Params, Progress, Result> {
@RealObject private AsyncTask<Params, Progress, Result> realAsyncTask;
@Implementation
public AsyncTask<Params, Progress, Result> executeOnExecutor(Executor executor, Params... params) {
return super.execute(params);
}
}
除了可能更改类的名称外,我不需要更改任何其他内容即可使其正常工作。最后一步是简单地用
注释您的测试类@Config(shadows={MyShadowAsyncTask.class})
非常适合我。
关于java - Robolectric、AsyncTasks 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31871997/