gpt4 book ai didi

java - RxJava2 Completable 未按预期组合

转载 作者:行者123 更新时间:2023-12-02 09:39:42 24 4
gpt4 key购买 nike

我的目的是能够通过管道传输一定数量的 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)

documentation of andThen中所示如果在之前的 Completable 中检测到错误,它看起来不应该订阅任何稍后添加的 Completable。我的问题是,为什么打印“<3>”,基本上,Completable 已运行。我怎样才能防止这种情况并简单地结束可竞争链呢?当文档表明这不应该发生时,为什么它要订阅 Completable c3?

最佳答案

事实上,它的工作原理正如你所期望的那样。但是,您正在订阅c3 :

c3.test().assertNotSubscribed();

这将订阅c3并打印<3> .

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

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

编辑

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

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

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

您可以使用assertNotSubscribed确保您尚未订阅测试观察者。实际上,该方法应该检查 onSubscribe还没有被调用。这并不是为了测试 dispose()被叫了。

对于这种情况,您必须执行类似 assertTrue(testObserver.isDisposed()) 的操作。您可以关注讨论here .

关于java - RxJava2 Completable 未按预期组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57197112/

24 4 0