java - 如何对 Android RxJava 多线程进行单元测试

标签 java android multithreading unit-testing rx-java

假设有一个按钮。

单击按钮将其禁用(ma​​inThread 线程),启动后台任务来加载数据(IO 线程)。加载数据后,该按钮将重新启用(ma​​inThread 线程)。

对于测试,通常将调度程序更改为立即,但这在我的情况下不起作用 - 按钮单击将被阻止,直到后台任务完成,我永远无法检查按钮在启动后台任务后是否被禁用。

除了单元测试之外,我还想在功能性 Espresso 测试中对此进行测试。

如何测试这个多线程 RxJava 案例?

最佳答案

你可以编写自己的ThreadFactory

ThreadFactory custom = new CustomThreadFactory();
ExecutorService executorService = Executors.newCachedThreadPool(custom); //or use newSingleThreadExecutor(..)
Scheduler customScheduler = Schedulers.from(executorService);

现在您可以使用此调度程序,而不会阻塞主队列,并且在需要新线程时被调用:

class CustomThreadFactory implements ThreadFactory {
  public Thread lastT;
  public int newThreadCounter = 0;
  @Override
  public Thread newThread(Runnable r) {
    newThreadCounter++;
    System.out.println("newThread called");
    Thread lastT = new Thread(r); //or CustomThread(r)
    return lastT;
  }
}

您甚至可以进一步检测新线程 -

 class CustomThread extends Thread {
    public CustomThread(Runnable r) {
      super(r);
    }
    @Override
    public void run() {
      System.out.printf("About to run!");
      super.run();
    }
  }
}

关于java - 如何对 Android RxJava 多线程进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40817617/

相关文章:

java - LiveData、Transformations.map() - 如何在用户更改过滤顺序时强制刷新?

android - 如何移动 editText 光标?

android - 使用 clipRect - 解释

java - 锁定免费解决方案,同时从 map 中递增计数器,然后读取它

node.js - CRON + Nodejs + 多核 => 行为?

c# - 如何在 C# 应用程序中启用 MMCSS?

java - 在maven中,如果我创建一个子包,主包是如何引用的?

java - RxJava2 将两个 Flowables 压缩为一个

java - 为什么 Eclipse 的表达式 View 在某些类上会失败?

java - 为什么 JDBI 中的查询是可关闭的?