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})
对我来说效果很好。
我最近开始使用 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})
对我来说效果很好。