【发布时间】:2020-03-07 07:28:08
【问题描述】:
Android Studio 3.5.2
RxJava2
Kotlin 1.3.50
我有一个像计时器一样的类。
class DelayTimerImp(private val scheduler: IScheduler)
: DelayTimer {
override fun createTimeout(delay: Long, timeUnites: TimeUnit): Completable {
return Completable.timer(delay, TimeUnit.SECONDS, scheduler.main())
}
}
我正在以这样的方法使用它:
private fun startTimeoutRequest(delay: Long) {
compositeSubscription.add(delayTimer.createTimeout(delay, TimeUnit.SECONDS)
.subscribeOn(schedulers.io())
.subscribe(::timeoutHasExceeded, ::timeoutError))
}
在我的测试类中,它使用TestScheduler 返回io 线程。我在嘲笑delayTimer。即使我thenReturn(Completable.complete()) timeOutHasExceeded 中的方法从不涉及它们。我在想如果Completable 已经完成进入那个方法。
@Test
fun `should reload and show loading state`() {
// Arrange
whenever(delayTimer.createTimeout(10, TimeUnit.SECONDS))
.thenReturn(Completable.complete())
// Act
vipInformationPresenterImp.tryAgainTapped()
// Assert methods in the timeOutHasExceeded
}
另外,如果我通过将延迟更改为 1 来更改以下内容:
whenever(delayTimer.createTimeout(1, TimeUnit.SECONDS))
.thenReturn(Completable.complete())
我将在以下行收到crash:
.subscribeOn(schedulers.io())
对此进行单元测试的最佳方法是什么?
在此先感谢
【问题讨论】:
-
你打电话给
TestScheduler.advanceTimeBy()还是TestScheduler.triggerActions()?