以下是在Android模拟器上运行的代码段,但在Junit测试中没有。
public void startObserving() {
Observable.just(1, 2, 3, 40)
.doOnNext(integer -> System.out.println("doOnNext item " + integer + " on: " + Thread.currentThread().getName()))
.subscribeOn(Schedulers.computation())
.observeOn(Schedulers.single())
.subscribe(integer -> System.out.println("Consuming item " + integer + " on: " + Thread.currentThread().getName()));
}
当我在Android Emulator上运行此方法时,会打印登录doOnNext()和subscribe(),但是当我将其作为JUnit测试运行时,则不会打印。 你们中的任何人都可以向我解释我在这里失踪的东西......
答案 0 :(得分:4)
记住你正在处理异步代码。在订阅实际发生之前,测试正在运行完成。添加sleep语句可以验证这一点:
@Test
public void startObserving() throws Exception {
Observable.just(1, 2, 3, 40)
.doOnNext(integer -> System.out.println("doOnNext item " + integer + " on: " + Thread.currentThread().getName()))
.subscribeOn(Schedulers.computation())
.observeOn(Schedulers.single())
.subscribe(integer -> System.out.println("Consuming item " + integer + " on: " + Thread.currentThread().getName()));
Thread.sleep(3000);
}
希望有所帮助!
答案 1 :(得分:2)
subscribeOn()
和observeOn()
运算符时,RxJava 正在异步运行流。因此,测试在流之前完成。
因此,出于测试目的,您必须同步流。您可以使用RxJavaPlugins
来实现此目的:
RxJavaPlugins.setComputationSchedulerHandler(sc -> Schedulers.trampoline());
RxJavaPlugins.setSingleSchedulerHandler(sc -> Schedulers.trampoline());