ant*_*009 5 android kotlin rx-java2
Android Studio 3.5.2
RxJava2
Kotlin 1.3.50
Run Code Online (Sandbox Code Playgroud)
我有下面的类,它像一个计时器。
class DelayTimerImp(private val scheduler: IScheduler)
: DelayTimer {
override fun createTimeout(delay: Long, timeUnites: TimeUnit): Completable {
return Completable.timer(delay, TimeUnit.SECONDS, scheduler.main())
}
}
Run Code Online (Sandbox Code Playgroud)
我在这样的方法中使用它:
private fun startTimeoutRequest(delay: Long) {
compositeSubscription.add(delayTimer.createTimeout(delay, TimeUnit.SECONDS)
.subscribeOn(schedulers.io())
.subscribe(::timeoutHasExceeded, ::timeoutError))
}
Run Code Online (Sandbox Code Playgroud)
在我的测试类中,它使用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
}
Run Code Online (Sandbox Code Playgroud)
另外,如果我通过将延迟更改为来更改以下内容1:
whenever(delayTimer.createTimeout(1, TimeUnit.SECONDS))
.thenReturn(Completable.complete())
Run Code Online (Sandbox Code Playgroud)
我将crash在以下一行中得到一个:
.subscribeOn(schedulers.io())
Run Code Online (Sandbox Code Playgroud)
对此进行单元测试的最佳方法是什么?
提前谢谢了
根据本教程,您应该使用TestScheduler覆盖它们:
class TestSchedulerProvider(private val scheduler: TestScheduler) : BaseSchedulerProvider {
override fun computation() = scheduler
override fun ui() = scheduler
override fun io() = scheduler
}
Run Code Online (Sandbox Code Playgroud)
然后,本教程稍后将使用TestScheduler,如下所示:
@Test
fun delayTestExample() {
//given
val presenter = DemoPresenter(testSchedulerProvider, view, service)
given(service.getSomeRemoteData()).willReturn(Single.just(5))
val delayInMillis = 1000L
//when
presenter.getSomeDataWithDelay(delayInMillis)
//then
then(view).should(never()).showData(anyInt())
// HERE:
testScheduler.advanceTimeBy(delayInMillis, TimeUnit.MILLISECONDS)
then(view).should().showData(5)
}
Run Code Online (Sandbox Code Playgroud)
在代码的advanceTimeBy注释下描述了的使用//HERE:。是否可以使用相同的方法来代替您:
whenever(delayTimer.createTimeout(1, TimeUnit.SECONDS))
.thenReturn(Completable.complete())
Run Code Online (Sandbox Code Playgroud)
您可以仅举一个例子:
testScheduler.advanceTimeBy(1500, TimeUnit.MILLISECONDS)
Run Code Online (Sandbox Code Playgroud)
在您创建超时之后的行中,我选择了1500,以便在AdvanceTimeBy继续之前在计时器中真正勾选了1秒。尽管每个值大于1000,它都应该运行良好,我只想确定就可以了;)
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |