Тест Spring Reactive не приводит к ожидаемой ошибке - PullRequest
0 голосов
/ 06 октября 2019

Я пишу юнит-тесты для одного из наших реактивных методов. Этот метод зависит от другого сервиса. Я издевался над этим сервисом. При выполнении теста я получаю следующую ошибку: java.lang.AssertionError: expectation "expectError(Class)" failed (expected: onError(MyException); actual: onComplete()).
Вот что я пробовал:
Метод (ReactiveService.class):

@Autowired
private Service serice;

public Mono<MyObject> save(List<MyObject> arg1, String arg2) {
    return SomeUtil.user()
            .map(user -> service.save(arg1, arg2, user))
            .subscribeOn(scheduler)
            .doOnError(e -> {
                throw new MyException(MyObject.class, "save object", e);
            });
}

Тест:

@Mock
Service service;

@InjectMocks
ReactiveService reactiveService;

@Test
public void unit_test(){
    when(service.save(any(), any(), any())).thenThrow(new RuntimeException());
    Mono<MyObject> result = reactiveService.save(arg1, arg2);
    StepVerifier.create(result)
        .expectError(MyException.class)
        .verify();
}

Из ошибки я понял, что от метода не получен сигнал. Но я не понимаю, чего мне здесь не хватало.

1 Ответ

1 голос
/ 07 октября 2019

Я думаю, что ваша проблема вызвана тем, что SomeUtil.user() не выдает значение.

Почему я думаю, что это так: я попробовал простой пример для воспроизведения вашей проблемы:

    @Test
    void test() {
        Mono<String> monoWithContent =
            Mono.just("Content")
            .map(element -> exceptionThrower());

        // TEST 1
        StepVerifier.create(monoWithContent)
            .expectError()
            .verify();

        Mono<String> monoWithoutContent =
            Mono.empty()
            .map(element -> exceptionThrower());

        // TEST 2
        StepVerifier.create(monoWithoutContent)
            .expectError()
            .verify();
    }

    String exceptionThrower() {
        throw new RuntimeException();
    }

Результат:

TEST 1 - успешно пройден, поскольку значение передается из Mono и сопоставляется с исключением (брошенный RuntimeExceptionexceptionThrower().

TEST 2 - завершается неудачей, потому что нет значения для выброса из Mono, поэтому метод map не вызывается и все выполнение завершаетсябез ошибки.

Итак, подведем итог: если из Publisher не выводится содержимое, то операции преобразования не запускаются.

...