以下是在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测试运行时,却没有打印出来。你们这些了不起的人能不能给我解释一下我错过了什么。
发布于 2018-06-03 07:19:45
请记住,您正在处理异步代码。在订阅实际发生之前,测试一直运行到完成。添加睡眠语句可以验证这一点:
@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);
}
希望这能有所帮助!
发布于 2018-06-03 18:26:07
当您提供subscribeOn()
和observeOn()
操作符时,RxJava将异步运行streams。因此,测试先于流完成。
因此,出于测试目的,您必须同步流。您可以使用RxJavaPlugins
实现这一点,如下所示:
RxJavaPlugins.setComputationSchedulerHandler(sc -> Schedulers.trampoline());
RxJavaPlugins.setSingleSchedulerHandler(sc -> Schedulers.trampoline());
https://stackoverflow.com/questions/50661908
复制相似问题