我最近开始使用Robolectric对我的一些Android应用程序进行单元测试,并且偶然发现了一个问题。在一些地方,我使用AsyncTasks进行一些后台计算,然后根据这些计算的结果更新UI。如果我使用execute()
来表示AsyncTask,当我运行我的测试以检查UI是否已正确更新时,它会通过。但是,出于各种原因,我实际上使用exectueOnExecutor()
THREAD_POOL_EXECUTOR
参数。当我用这个运行测试时,测试失败,认为UI尚未更新。同样,如果我从一个线程执行此操作并回发到UI线程,我也有同样的问题。有没有办法解决这个问题?
答案 0 :(得分:0)
经过几个小时的搜索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})
非常适合我。