gpt4 book ai didi

unit-testing - RxJava可观察完成,但在单元测试中未触发doOnComplete回调

转载 作者:行者123 更新时间:2023-12-02 13:08:48 27 4
gpt4 key购买 nike

我有以下逻辑用于从可完成(使用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()成功执行了)。似乎处理的太早了,所以没有调用回调,但是为什么呢?

最佳答案

更新

使用单元测试和模拟来测试代码。我将 kolin.test 模拟用于个人喜好。

interface CompletableSrc {
fun getCompletable(): Completable
}

interface Client {
fun doSomething()
fun doSomethingElse()
}

class CompletableTest {

@Test
fun `functions doOnComplete and doOnSuccess should work as expected`() {
val completableSrc: CompletableSrc = mockk {
every { getCompletable() } returns Completable.complete()
}

val client: Client = mockk {
every { doSomething() } returns Unit
every { doSomethingElse() } returns Unit
}

val observable = completableSrc.getCompletable()
.doOnComplete { client.doSomething() }
.toSingleDefault(0)
.map { it + 1 }
.doOnSuccess { client.doSomethingElse() }
.toObservable()
.startWith(-1)

val test = observable.test()
test.assertComplete()
test.assertValues(-1, 1)

verify(exactly = 1) {
completableSrc.getCompletable()
client.doSomething()
client.doSomethingElse()
}
}
}

如您所见,断言和模拟验证均成功。

上一个

您的代码应该运行良好,对我来说真的很难说出问题所在,因为我无法运行它,但是我创建了一个片段,它的功能几乎相同,并且可以按预期工作。

示例
fun main(args: Array<String>) {
var sideEffect = 0

val observable = Completable.complete()
.doOnComplete { sideEffect += 1 }
.toSingleDefault(sideEffect)
.map { sideEffect + 1 }
.doOnSuccess(::println)
.toObservable()
.startWith(-1)

val test = observable.test()
test.assertComplete()
test.assertValues(-1, 2)
}

输出
2

副作用函数 Completable.doOnCompleteSingle.doOnSuccess均被执行,更新变量 sideEffect并打印到控制台。

关于unit-testing - RxJava可观察完成,但在单元测试中未触发doOnComplete回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54007087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com