【发布时间】:2018-03-12 18:16:44
【问题描述】:
我对我的 retryWhen 块进行了测试。使用模拟器进行测试时,它可以正常工作。我还有一个检查重试是否通过的测试。但是,有时我的测试会失败。我尝试使用 Scheduler.immediate。但是,这也会导致测试失败。
open fun getItem(id: String): Single<Item> {
return getItemHelper(id)
.retryWhen { errors ->
errors.take(1)
.filter { it is NotFoundException }
.flatMap { _ ->
getItemFromServer(id)
.andThen(Observable.just(true))
}
}.subscribeOn(Schedulers.io())
}
测试:
fun getListOfItem_Retry {
val objectUnderTest = item[2]
val testSubscriber : AssertableSubscriber<Item> = actions.getItem(objectUnderTest.id).test()
testSubscriber.awaitTerminalEvent()
testSubscriber.assertNoErrors();
assertTrue(getCalls == 2)
}
在设置中,我有
RxJavaHooks.reset()
RxJavaHooks.setOnIOScheduler({ _ -> Schedulers.immediate()})
拆解,我有:
RxJavaHooks.reset()
当我移除钩子时,它通过了。但是,有时测试会失败。我怎样才能使测试稳定?
另外,我得到一个 no Observable Emitted NoSuchElementException
【问题讨论】:
-
问题在于重试处理逻辑中的
take(1),它将完成内部重试序列并且可以完成外部序列。你想对第一个错误做什么? -
我希望得到第一个错误,然后检查它是否有效,然后重试。我只想重试一次。
-
有没有办法让它通过 take(1)? @akarnokd
标签: kotlin rx-java nosuchelementexception retrywhen