我希望能够对发射延迟的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)
}