如何对RxJava重试单元测试

时间:2018-12-21 10:59:04

标签: android unit-testing rx-java rx-java2

我正在尝试对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)
    }

有人知道我们可以对此进行测试吗? (未能找到太多有关测试的信息以确保ret​​ryWhen可以正常工作

TIA

1 个答案:

答案 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中的计时器调度是如何工作的;您当然无法有效地测量任何较短的时间间隔。