2017-08-14 67 views
6

我有以下RxJava2科特林代碼:RxJava Completabe andThen測試

val tester = Completable.complete() 
      .andThen(SingleSource<Int> { Single.just(42) }) 
      .test()   
tester.assertComplete() 
tester.assertValue(42) 

這模擬有Completable觀察到的(想象一個簡單的更新操作的API),然後一個單一可觀察(圖像上的一個GET操作API)。我想連接兩個observable,當Completable完成時,Single運行,最後我在觀察者(Int 42)上得到onSuccess事件。

但是這個測試代碼不起作用。斷言失敗,出現以下錯誤:

java.lang.AssertionError: Not completed 
(latch = 1, values = 0, errors = 0, completions = 0)) 

我不能夠理解我在做什麼錯了,我想到的是,Completable發出的onComplete上訂閱,然後單訂,我的觀察者(tester)獲取一個值爲42的onSuccess事件,但似乎訂閱保持「暫停」不發射任何東西。

的想法是一個類似於在這個博客帖子發現:https://android.jlelse.eu/making-your-rxjava-intentions-clearer-with-single-and-completable-f064d98d53a8

apiClient.updateMyData(myUpdatedData) // a Completable 
    .andThen(performOtherOperation()) // a Single<OtherResult> 
    .subscribe(otherResult -> { 
     // handle otherResult 
    }, throwable -> { 
     // handle error 
    }); 

回答

8

的問題是科特林其曖昧使用大括號:

.andThen(SingleSource<Int> { Single.just(42) }) 

您創建一個SingleSource,做注意到它的SingleObserver,但這是由Kotlin語法隱藏的。你需要的是簡單的使用:

.andThen(Single.just(42)) 

或延期使用

.andThen(Single.defer { Single.just(42) }) 
+0

感謝akarnokd,由於某種原因,我補充說,該代碼,因爲最初我是做'.andThen {Single.just(42) }'這不是編譯。 – Miquel