Проверка реактора StepVerifier не выполняется с помощью blockFirst () - PullRequest
0 голосов
/ 09 января 2019

Вот код для проверки дубликатов имен в базе данных

public Mono<Void> validateDuplicateName(String name) throws RuntimeException {
    Flux<Customer> customerFlux = customerRepository.findByNameIgnoreCase(name);

    customerFlux.take(1).flatMap( customer -> {
        return Mono.error( new RuntimeException ("ABC99") );
    }).blockFirst();

    return Mono.empty();
}

Ниже приведен тестовый скрипт для проверки метода validateDuplicateName

when(customerRepositoryMocked.findByNameIgnoreCase(Mockito.anyString())).thenReturn(Flux.just(customerMocked));
StepVerifier.create(customerValidator.validateDuplicateName(Mockito.anyString()))
        .expectErrorMatches( exception -> exception instanceof RuntimeException )
        .verify();

Но тест не пройден с приведенной ниже ошибкой

java.lang.RuntimeException: ABC99
..
..
Suppressed: java.lang.Exception: #block terminated with an error
        at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:93)
        at reactor.core.publisher.Flux.blockFirst(Flux.java:2013)
        ... 34 more

Могу ли я получить помощь?

1 Ответ

0 голосов
/ 10 января 2019

Ваш StepVerifier может на самом деле проверять только Mono.empty(), который систематически возвращается методом. В то же время, вы используете blockFirst, который будет генерировать любое исключение, выдаваемое издателем, короткое замыкание всего утверждения.

Помните, StepVerifier позволяет вам утверждать, что последовательность будет генерироваться асинхронно (включая ошибки, в виде onError сигналов). Если последовательность не может быть даже создана из-за того, что метод ее создания (validateDuplicateName) выбрасывает, то StepVerifier беспомощен.

Но на самом деле вопрос заключается в том, почему вы блокируете внутри метода, который имеет Mono тип возвращаемого значения И имеет очень хороший Mono удобный источник? Ваше возвращение Mono должно быть получено из этого customerFlux.

Вы можете использовать then() для переключения на Mono<Void>: это игнорирует элементы источника, но правильно выдает ошибку.

...