首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试多线程Android RxJava的方法

单元测试多线程Android RxJava的方法
EN

Stack Overflow用户
提问于 2016-11-26 10:57:29
回答 2查看 1.2K关注 0票数 1

假设有一个按钮。

单击该按钮将禁用它(mainThread线程),启动加载数据的后台任务(IO线程)。一旦加载了数据,按钮就会被启用(mainThread线程)。

为了进行测试,通常会将调度程序更改为即时,但这在我的情况下是行不通的--在后台任务完成之前,按钮单击将被阻塞,我将永远无法检查该按钮在启动后台任务后是否已被禁用。

除了单元测试之外,我还想在functional测试中测试这一点。

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

EN

回答 2

Stack Overflow用户

发布于 2016-11-26 11:59:21

您可以编写自己的ThreadFactory

代码语言:javascript
复制
ThreadFactory custom = new CustomThreadFactory();
ExecutorService executorService = Executors.newCachedThreadPool(custom); //or use newSingleThreadExecutor(..)
Scheduler customScheduler = Schedulers.from(executorService);

现在,您可以使用此调度程序,而不阻塞主队列,还可以在需要新线程时进行调用:

代码语言:javascript
复制
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;
  }
}

你甚至可以走得更远,用新的丝线-

代码语言:javascript
复制
 class CustomThread extends Thread {
    public CustomThread(Runnable r) {
      super(r);
    }
    @Override
    public void run() {
      System.out.printf("About to run!");
      super.run();
    }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2016-11-28 12:05:49

我建议你使用RxUtil

1).通过构造函数或DI提供默认实现 of RxUtil

2).创建可观察的,而不是直接应用调度程序:

代码语言:javascript
复制
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())

使用RxUtil

代码语言:javascript
复制
.compose(rxUtil.applySchedulers())

示例:

https://github.com/DAYTeam/GoEnglish/blob/master/app/src/main/java/ru/goenglish/goenglish/services/impl/ScheduleServiceImpl.java#L38-L44

3).中的单元测试,而不是RxUtil的默认实现,创建模拟版本:

代码语言:javascript
复制
public class UnitTestRxUtil implements RxUtil {
    @Override
    public <T> Observable.Transformer<T, T> applySchedulers() {
        return observable -> observable.subscribeOn(Schedulers.immediate())
                .observeOn(Schedulers.immediate());
    }
}

链接:https://github.com/DAYTeam/GoEnglish/blob/master/app/src/test/java/ru/goenglish/goenglish/util/UnitTestRxUtil.java

4).通过构造函数或DI传递此实现。

示例(构造函数):https://github.com/DAYTeam/GoEnglish/blob/master/app/src/test/java/ru/goenglish/goenglish/ScheduleServiceImplTest.java#L45

因此,所有的测试都将在一个线程中执行,而在应用程序中,它将在不同的执行程序上执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40817617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档