Как выполнить модульный тест RxJava retryWhen - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь использовать экспоненциальный откат с 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)
    }

Кто-нибудь знает, как мы можем проверить это?(не удалось найти много информации о тестировании, чтобы убедиться, что повторная попытка работает)

TIA

1 Ответ

0 голосов
/ 21 декабря 2018

Модульное тестирование Операции с таймером RxJava лучше всего выполнять с TestScheduler.

// 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;вы определенно не сможете измерить более короткие интервалы.

...