假设有一个按钮。
单击该按钮将禁用它(mainThread线程),启动加载数据的后台任务(IO线程)。一旦加载了数据,按钮就会被启用(mainThread线程)。
为了进行测试,通常会将调度程序更改为即时,但这在我的情况下是行不通的--在后台任务完成之前,按钮单击将被阻塞,我将永远无法检查该按钮在启动后台任务后是否已被禁用。
除了单元测试之外,我还想在functional测试中测试这一点。
如何测试这个多线程RxJava案例?
发布于 2016-11-26 11:59:21
您可以编写自己的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();
}
}
}发布于 2016-11-28 12:05:49
我建议你使用RxUtil
1).通过构造函数或DI提供默认实现 of RxUtil
2).创建可观察的,而不是直接应用调度程序:
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())使用RxUtil
.compose(rxUtil.applySchedulers())示例:
3).中的单元测试,而不是RxUtil的默认实现,创建模拟版本:
public class UnitTestRxUtil implements RxUtil {
@Override
public <T> Observable.Transformer<T, T> applySchedulers() {
return observable -> observable.subscribeOn(Schedulers.immediate())
.observeOn(Schedulers.immediate());
}
}4).通过构造函数或DI传递此实现。
因此,所有的测试都将在一个线程中执行,而在应用程序中,它将在不同的执行程序上执行。
https://stackoverflow.com/questions/40817617
复制相似问题