我正在测试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对其进行测试。

关于unit-testing - RxJava2:TestSubscriber.AssertNoErrors总是通过,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43694949/

10-10 04:52