Robolectric、AsyncTasks 和线程

Robolectric, AsyncTasks and Threads

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

经过几个小时的搜索 this 线程帮助我解决了我的问题。 在简单的步骤中,您必须创建一个新的 class 来隐藏使用 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);
    }       
}

除了可能更改 class 的名称外,我不需要更改任何其他内容即可使其正常工作。最后一步就是用

注释您的测试 class

@Config(shadows={MyShadowAsyncTask.class})

对我来说效果很好。