Вот код RxJava, который я хочу протестировать:
public void triggerCancelOrderJob() {
couchConnector()
.findAbandonedOpenOrders()
.flatMap(results -> results.rows())
.flatMap(
row ->
Observable.just(row)
.subscribeOn(Schedulers.io())
.map(
s -> return s.value())
.flatMap(
orderId -> {
return RxReactiveStreams.toObservable(
serviceTokenCache
.get(OrderApiConstants.SERVICE_TOKEN_CACHE_KEY)
.flatMap(
issueToken -> {
return cancelOrderApiConnector()
.invokeAPI(
RequestInputModel.builder().build(),
RequestInputModel.RequestBodyModel.builder().build());
}));
}))
.subscribe(//additional code)
Итак, что происходит: я запускаю асинхронный CB-запрос, получаю Observable< AsyncN1qlQueryResult >, затем для каждой строки, которую я вызываю, вызываю две внешние службы одну за другой (первый вызов serviceTokenCache и второй вызов cancelOrderApiConnector). Каждая строка выполняется в отдельном потоке IO.
Примечание: serviceTokenCache.get() и cancelOrderApiConnector().invokeAPI() возвращают Mono соответственно.
Я не могу понять, как проверить этот код. Какие все компоненты нужно протестировать? Поскольку каждая строка будет выполняться в отдельном потоке, я не могу понять, как тестировать такой асинхронный код.
Во-первых, внедрите планировщики вместо использования Schedulers.io(). Это значительно упростит модульное тестирование. Во-вторых, имитируйте или вводите код для внешних вызовов. Кроме того, вы используете вложенный flatMap() неправильно или избыточно - он не делает то, что вы думаете.




Имитируйте внешние вызовы с помощью
Mockito