Rx-Kotlin awaitTerminalEvent从未获得onComplete

时间:2017-05-04 00:00:00

标签: unit-testing testing kotlin rx-java2 rx-kotlin

我正在努力更好地了解如何使用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)
    }
}

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()