使用RxJava2在Android模拟器和JVM上的不同行为

时间:2018-06-02 23:03:14

标签: android junit rx-java2

以下是在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测试运行时,则不会打印。 你们中的任何人都可以向我解释我在这里失踪的东西......

2 个答案:

答案 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());