Robolectric,AsyncTasks和Threads

时间:2015-08-07 07:31:11

标签: java android testing android-asynctask robolectric

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

1 个答案:

答案 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})

非常适合我。