我正在努力更好地了解如何使用Rx-Kotlin进行单元测试,但我无法成功将主题设置为“已完成”。因此,我总是在等待5秒的超时(onComplete应该是立即的),然后在assertComplete上失败。
我对awaitTerminalEvent的理解是它只应该阻塞,直到调用onComplete。我也研究过TestScheduler,,但我不相信这里应该要求它。
任何可以引导我朝着正确方向前进的帮助或文档都将非常感激。
@Test
fun testObservable() {
val subject = BehaviorSubject.create<Int>()
subject.onNext(0)
TestSubscriber<Int>().apply {
subject.subscribe({
System.out.println(it)
subject.onNext(1)
subject.onComplete()
})
this.awaitTerminalEvent(5, TimeUnit.SECONDS)
this.assertComplete()
this.assertValue(1)
}
}
答案 0 :(得分:5)
你以错误的方式使用了错误的工具......
TestSubscriber
用于测试Flowable
,您应该在TestObserver
使用。TestObserver
(或TestSubscriber
中的Flowable
),以便监控排放并能够等待终端事件和断言值。在您的代码中,TestSubscriber
未附加到任何流,因此它永远不会获得任何事件。 试图模仿你的代码,它可能是这样的:
@Test
fun testObservable() {
val subject = BehaviorSubject.create<Int>()
subject.onNext(0)
TestObserver<Int>().apply {
subject.doOnNext {
System.out.println(it)
subject.onNext(1)
subject.onComplete()
}
.subscribe(this)
this.awaitTerminalEvent(5, TimeUnit.SECONDS)
this.assertComplete()
this.assertValue(1)
}
}
正如您所看到的,我使用TestObserver
订阅已完成TestObserver
对象,主题onNext()
,onComplete()
已转移到{ {1}}。由于您有两个发射值,测试将失败,而测试仅针对单个&#39; 1&#39;值。
一般来说,这是错误的,你使用subject在doOnNext()
再次发出然后调用onNext()
,你可以先订阅然后向外发射。像这样的东西:
onComplete()