unit-testing - RxJava2 : TestSubscriber. AssertNoErrors 总是通过

标签 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);

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

我做错了什么?

最佳答案

只需要调换执行顺序,将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/

相关文章:

unit-testing - 测试框架意外退出 - Mac 上的 Dart 项目

java - Mockito 不是在 mock 电话

java - 使用 Mockito 对 Runnable 进行单元测试

unit-testing - Zuul 没有抛出预期的异常

perl - 如何在 Perl 中测试对资源(缓存)的并发访问?

rx-java - 为什么 Flowable 不是 Observable

java - android 中 RxJava2 中的 subscribe() 和 subscribeWith() 有什么区别?

rx-java - 使用多播重复 RxJava 管道

javascript - Sinon.js stub 对象内部的匿名函数

testing - 使用 goconvey 明确指定要在 golang 中运行测试的主包