У меня есть следующая логика для создания наблюдаемых данных из завершаемых (с обратным вызовом 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
дает, что было 2 взаимодействияс макетом client
, но нужный метод не был вызван.Я обнаружил, что если я немного поменяю цепочку следующим образом:
completableSrc.getCompletable(client.type, values)
.toSingleDefault(…)
.map { … }
.doOnSuccess { client.doSomething(values)}
.toObservable()
.startWith(State.InProgress)
, то это работает.Я просто не знаю, почему предыдущая версия с doOnComplete
не работает (observer.assertComplete()
успешно выполняется).Кажется, что он утилизируется слишком рано, поэтому обратный вызов не вызывается, но почему?