如何测试RetryWhen

时间:2018-03-11 17:24:51

标签: kotlin rx-java nosuchelementexception 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()

当我取下钩子时,它会通过。但是,偶尔测试失败。如何让测试稳定?

另外,我得到一个没有Observable Emitted NoSuchElementException

1 个答案:

答案 0 :(得分:1)

看起来您确实希望在第一个源发生故障时实施回退机制。您可以使用onErrorResumeNext

getItemHelper(id)
.onErrorResumeNext({ error -> 
    if (error is NotFoundException) {
        return getItemFromServer(id)
    }
    return Single.error(error)
})
.subscribeOn(Schedulers.io())
.test()
.awaitTerminalEvent()
.assertNoErrors()