【发布时间】:2019-01-02 13:17:25
【问题描述】:
我有以下逻辑用于从可完成(使用doOnComplete 回调)创建可观察数据,这是经过单元测试的:
class ObservableSrc(val completableSrc: CompletableSrc) {
fun getObservable(client: Client): Observable<State> {
return client.getResults()
.concatMap { processResult(client, it.values) }
}
private fun processResult(Client: Client, values: Values): Observable<State> =
completableSrc.getCompletable(client.type, values)
.doOnComplete { client.doSomething(values)}
.toSingleDefault(…)
.map { … }
.toObservable()
.startWith(State.InProgress)
}
@Test
fun test() {
whenever(client.type).doReturn(Type.SOME_TYPE)
whenever(client.getResults()).doReturn(Observable.just<Result>(Result(mock())))
whenever(completableSrc.getCompletable(any(), any())).doReturn(Completable.complete())
doNothing().whenever(client).doSomething(any())
val observer = tested.getObservable(client).test()
observer.assertComplete()
verify(completableSrc, times(1)).getCompletable(any(), any())
verify(client, times(1)).doSomething(any())
}
问题是验证 doSomething 给出了与模拟 client 的 2 次交互,但未调用所需的方法。我发现如果我像这样改变链接:
completableSrc.getCompletable(client.type, values)
.toSingleDefault(…)
.map { … }
.doOnSuccess { client.doSomething(values)}
.toObservable()
.startWith(State.InProgress)
然后就可以了。我只是不知道为什么带有doOnComplete 的先前版本失败(observer.assertComplete() 执行成功)。似乎它被处理得太早了,所以没有调用回调,但为什么呢?
【问题讨论】:
-
Completable 是否应该在任何这些链式方法调用中达到完成阶段?
-
startWith来自哪里?据我所知,您正在将Completable转换为Single(.toSingleDefault(…)),但Single没有startWith(因为它确实有意义,因为它只发出一个值) -
我的错,
startWith来自调用toObservable后的 observable。我更新了问题。 Completable 是一个网络调用(Retrofit with Rx),但它在单元测试中被模拟了。
标签: unit-testing junit kotlin mockito rx-java2