Модульное тестирование кода RxJava с несколькими внешними вызовами

Вот код 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 соответственно.

Я не могу понять, как проверить этот код. Какие все компоненты нужно протестировать? Поскольку каждая строка будет выполняться в отдельном потоке, я не могу понять, как тестировать такой асинхронный код.

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

Niraj Chauhan 22.11.2018 08:44

Во-первых, внедрите планировщики вместо использования Schedulers.io(). Это значительно упростит модульное тестирование. Во-вторых, имитируйте или вводите код для внешних вызовов. Кроме того, вы используете вложенный flatMap() неправильно или избыточно - он не делает то, что вы думаете.

Bob Dalgleish 22.11.2018 15:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
38
0

Другие вопросы по теме