繁体   English   中英

RxJava2 Completable未按预期组合

[英]RxJava2 Completable does not combine as expected

我的意图是能够传递一定数量的Completable,但是,如以下测试案例所示,它无法按预期工作。

@Test
public void test_and_then() {

    Completable c1 = Completable.fromAction(() -> {
        System.out.println("<1>");
    });

    Completable c2 = Completable.fromAction(() -> {
        System.out.println("<2.1>");
        boolean test = true;
        if (test) {
            throw new Exception();
        }
        System.out.println("<2.2>");
    });

    Completable c3 = Completable.fromAction(() -> {
        System.out.println("<3>");
    });


    Completable.complete()
            .andThen(c1)
            .andThen(c2)
            .andThen(c3)
            .test()
            .assertError(t -> true)
            .dispose();

    c3.test().assertNotSubscribed();
}

这将导致以下输出。

<1>
<2.1>
<3>
java.lang.AssertionError: Subscribed! (latch = 0, values = 0, errors = 0, completions = 1)

andThe文档中可以看出,如果在先前的Completable中检测到错误它似乎不应订阅以后添加的任何Completable。 我的问题是,为什么打印“ <3>”,基本上是运行Completable。 我该如何防止这种情况,而只是结束可竞争者链? 当文档指示不应发生这种情况时,为什么还要订阅Completable c3?

实际上,它按预期工作。 但是,您正在订阅c3

c3.test().assertNotSubscribed();

这将订阅c3并打印<3>

如果您删除该行,它将按预期工作。

test()订阅,并为您提供可以对其进行断言的测试观察者。 只是不幸的是输出顺序-它使您认为流没有停止。

编辑

关于注释“如果assertNotSubscribed总是失败,它的目的是什么”。

说实话,这是一个误解。 test()不是创建TestObserver的唯一方法。 您可以像这样创建一个测试观察者

TestObserver<Void> testObserver = new TestObserver<>();

您可以使用assertNotSubscribed来确保尚未订阅测试观察者。 实际上,该方法应该检查是否已调用onSubscribe 这并不是要测试dispose()被调用。

在这种情况下,您必须执行assertTrue(testObserver.isDisposed()) 您可以在此处关注讨论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM