java - Robolectric、AsyncTasks 和线程

标签 java android testing android-asynctask robolectric

我最近开始使用 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/

相关文章:

testing - 如何在 Postman 的新 pm.* API 中使用条件语句?

JAVA 类路径将文件作为命令行参数传递

android - Android Studio 中的 list 合并

android - 如何通过在鳍状肢中启用多点触控缩放来进行 webview 滑动手势检测

unit-testing - 我应该使用一个接口(interface)来允许模拟吗?

javascript - 开 Jest - 在测试前解决 promise

Java,为什么我的图形超出了它们应该在的框架/范围?

java - 将参数传递给枚举抽象方法

java - 插入数组时出现 ArrayIndexOutOfBoundsException

android - 我不小心从Play商店取消发布了android应用,现在该如何重新发布呢?