我希望能够对发射延迟的Observable进行单元测试,但无需实际等待延迟时间。有没有办法做到这一点?

我目前正在使用CountDownHatch来延迟断言,它可以正常工作,但是会增加测试运行时间。

例:

val myObservable: PublishSubject<Boolean> = PublishSubject.create<Boolean>()
fun myObservable(): Observable<Boolean> = myObservable.delay(3, TimeUnit.SECONDS)

@Test
fun testMyObservable() {
    val testObservable = myObservable().test()
    myObservable.onNext(true)

    // val lock = CountDownLatch(1)
    // lock.await(3100, TimeUnit.MILLISECONDS)
    testObservable.assertValue(true)
}

最佳答案

感谢@ aaron-he的回答,我得以提出一个完整的解决方案。

它结合使用TestScheduler来延长时间,还使用RxJavaPlugins来用testScheduler覆盖默认调度程序。这允许测试myObservable()函数,而无需进行修改或需要传递Scheduler

@Before
fun setUp() = RxJavaPlugins.reset()

@After
fun tearDown() = RxJavaPlugins.reset()

@Test
fun testMyObservable() {
    val testScheduler = TestScheduler()
    RxJavaPlugins.setComputationSchedulerHandler { testScheduler }

    val testObservable = myObservable().test()
    myObservable.onNext(true)

    testScheduler.advanceTimeBy(2, TimeUnit.SECONDS)
    testObservable.assertEmpty()
    testScheduler.advanceTimeBy(2, TimeUnit.SECONDS)
    testObservable.assertValue(true)
}

08-17 14:07