gpt4 book ai didi

android - 使用 Completable.timer 对 RxJava 进行单元测试

转载 作者:行者123 更新时间:2023-12-04 18:00:27 25 4
gpt4 key购买 nike

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线。我在 mock 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())

对此进行单元测试的最佳方法是什么?

提前谢谢了

最佳答案

根据this tutorial你应该用 TestScheduler 覆盖这些:

class TestSchedulerProvider(private val scheduler: TestScheduler) : BaseSchedulerProvider {
override fun computation() = scheduler
override fun ui() = scheduler
override fun io() = scheduler
}

然后稍后本教程使用 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)
}

使用 advanceTimeBy在评论 //HERE: 下进行了描述在代码中。是否可以使用相同的方法,而不是您的:
whenever(delayTimer.createTimeout(1, TimeUnit.SECONDS))
.thenReturn(Completable.complete())

你会调用例如:
testScheduler.advanceTimeBy(1500, TimeUnit.MILLISECONDS)

在您创建超时和我选择的 1500 之后的行中,以便在advanceTimeBy 继续之前真正在计时器中打勾 1 秒。不过,它应该与每个 > 1000 的值都很好,我只是想确定一下;)

关于android - 使用 Completable.timer 对 RxJava 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58804251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com