RxJava Completabe然后测试

时间:2017-08-14 17:55:09

标签: rx-java

我有以下RxJava2 Kotlin代码:

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

这模拟具有Completable observable(想象一个对API的简单更新操作),然后是Single observable(在API上映像获取操作)。我希望以一种方式连接两个observable,当Completable完成时,Single运行,最后我在我的观察者(Int 42)上获得onSuccess事件。

然而,此测试代码无效。断言失败并出现以下错误:

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

我无法理解我做错了什么,我希望Completable在订阅时发出onComplete,然后Single订阅,我的观察者(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
    });

1 个答案:

答案 0 :(得分:13)

问题是Kotlin对花括号的模糊使用:

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

您创建的SingleSource注明了SingleObserver,但是被Kotlin语法隐藏了。你需要的是明确的用途:

.andThen(Single.just(42))

或延期使用

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