簡體   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