RxJava2:TestSubscriber.AssertNoErrors总是通过

时间:2017-04-29 11:12:52

标签: unit-testing testing rx-java2

我正在测试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);

问题是这个测试总是通过,但我仍然可以在日志

中找到异常

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您只需要切换执行顺序,并将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进行测试。