我正在尝试对RxJava Completable使用指数补偿,并且在尝试时代码可以正常工作。因此,试图添加一个单元测试来覆盖它,但是不确定如何在此处测试retryWhen
部分。
fun makeCall(
scheduler: Scheduler = scheduler.io()
) : Completable {
val value = "myString"
return myCompletable(value)
.retryWhen { errors: Flowable<Throwable> ->
errors
.zipWith(Flowable.range(1, 3))
.flatMap { errorRetryPair: Pair<Throwable, Int> ->
Flowable.timer(2.toDouble().pow(errorRetryPair.second.toDouble()).toLong(), TimeUnit.SECONDS)
}
}.subscribeOn(scheduler)
}
有人知道我们可以对此进行测试吗? (未能找到太多有关测试的信息以确保retryWhen可以正常工作
TIA
答案 0 :(得分:0)
最好使用TestScheduler
完成单元测试RxJava定时操作。
// in your test code
simulateFailure();
long firstStepMs = 2_000; // first backoff time in ms
long epsilon = 40; // 10ms is too small
scheduler.advanceTimeBy( firstStepMs - epsilon, TimeUnit.MILLISECONDS );
// test to see that resubscription has NOT occurred
scheduler.advanceTimeBy( 2 * epsilon, TimeUnit.MILLISECONDS );
// test to see that first resubscription HAS occurred
,然后重复不同的退避时间。提前时钟的粒度取决于您。 epsilon
必须大于10毫秒,因为Java中的计时器调度是如何工作的;您当然无法有效地测量任何较短的时间间隔。