RxJava2:TestSubscriber.AssertNoErrors 总是通过

RxJava2: TestSubscriber.AssertNoErrors always pass

我正在测试 Rxjava2(2.0.7) 的一些特性 在单元测试中遇到一些麻烦

这是我的代码

    RxJavaPlugins.setErrorHandler(null);
    Observable<String> o = Observable.create((ObservableOnSubscribe<String>) e -> {
        String s = System.currentTimeMillis() + "";
        System.out.println("runing observable@" + s);
        throw new RuntimeException();
    }).delay(1, TimeUnit.SECONDS);

    o
            .doOnNext(x -> {
                System.out.println(x);
                throw new RuntimeException();
            })
            .doOnError(e->e.printStackTrace())
            .test()
            .assertNoErrors()
            .awaitCount(1)
            .awaitDone(5, TimeUnit.SECONDS);

问题是这个测试总是通过,但我仍然可以在日志中找到异常打印

我做错了什么?

只需要调换执行顺序,把assertNoErrors()放在最后即可。

RxJavaPlugins.setErrorHandler(null);
    Observable<String> o = Observable.create((ObservableOnSubscribe<String>) e -> {
        String s = System.currentTimeMillis() + "";
        System.out.println("runing observable@" + s);
        throw new RuntimeException();
    })
            .delay(1, TimeUnit.SECONDS);

    o
            .doOnNext(x -> {
                System.out.println(x);
                throw new RuntimeException();
            })
            .doOnError(e -> e.printStackTrace())
            .test()
            .awaitCount(1)
            .awaitDone(5, TimeUnit.SECONDS)
            .assertNoErrors();

否则 assertNoErrors() 在您调用 test() 运算符后立即采取行动,错误仍然没有在流中传播。
一般来说,你应该先用 awaitXXX 来等待一些预期的事件发生,然后用 assertXXX.

来测试它。