RxJava2 Completable未按预期进行组合

RxJava2 Completable未按预期进行组合,java,rx-java,reactive-programming,rx-java2,reactive,Java,Rx Java,Reactive Programming,Rx Java2,Reactive,我的意图是能够通过管道传输一定数量的数据,但是,从下面的测试用例中可以看出,它不能像预期的那样工作 @测试 公共无效测试_和_then(){ Completable c1=Completable.fromAction(()->{ System.out.println(“”); }); Completable c2=Completable.fromAction(()->{ System.out.println(“”); 布尔检验=真; 如果(测试){ 抛出新异常(); } System.out.p

我的意图是能够通过管道传输一定数量的数据,但是,从下面的测试用例中可以看出,它不能像预期的那样工作

@测试
公共无效测试_和_then(){
Completable c1=Completable.fromAction(()->{
System.out.println(“”);
});
Completable c2=Completable.fromAction(()->{
System.out.println(“”);
布尔检验=真;
如果(测试){
抛出新异常();
}
System.out.println(“”);
});
Completable c3=Completable.fromAction(()->{
System.out.println(“”);
});
Completable.complete()
.及(c1)
.第三(c2)
.然后(c3)
.test()
.assertError(t->true)
.dispose();
c3.test().assertNotSubscribed();
}
这将产生以下输出


java.lang.AssertionError:已订阅!(闩锁=0,值=0,错误=0,完成=1)
如图所示,如果在前一个Completable中检测到错误,它似乎不应该订阅以后添加的任何Completable。 我的问题是,为什么要打印“”,基本上,Completable是运行的。我怎样才能避免这种情况,而只是简单地结束可编译文件链呢?
当文档表明不应该发生这种情况时,它为什么订阅Completable c3?

实际上,它的工作方式与您预期的一样。但是,您正在订阅
c3

c3.test().assertNotSubscribed();
这将订阅
c3
并打印

如果你去掉那条线,它会像你期望的那样工作

test()。不幸的是输出顺序——它使您认为流没有停止

编辑

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

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

TestObserver<Void> testObserver = new TestObserver<>();
TestObserver TestObserver=newtestobserver();
您可以使用
assertNotSubscribed
确保尚未订阅测试观察员。实际上,该方法应该检查subscribe
是否未被调用。这并不是为了测试调用了
dispose()


对于这个场景,您必须执行类似于
assertTrue(testObserver.isDisposed())
的操作。您可以继续讨论。

谢谢您的回答,您是正确的。但是,如果资产总是失败,那么它的目的是什么呢?你介意编辑你的答案来合并这个吗。