Модульный тест для метода doOnError при возникновении ошибки из zip-метода Mono

#java #mockito #reactive-programming #spring-webflux #project-reactor

#java #mockito #реактивное программирование #spring-webflux #проект-реактор

Вопрос:

У меня есть следующий код:

 public void process(AnotherObject anotherObject) {
    Mono.zipDelayError(
        this.zipService.getObject(id1),
        this.zipService.getObject(id2),
        this.zipService.getObject(id3),
        this.zipService.getObject(id4))
        .map(objects -> {
            return Tuples.of(anotherObject, objects.getT1(), objects.getT2());
        }).onErrorMap(Function.identity())
        .doOnError(throwable -> {
            Error error = create(throwable);
            this.errorService.procesarError(error);
        }).suscribe(objects -> 
            this.dbservice.save(objects.getT2())
            .doOnError(throwable -> {
                Error error = create(throwable);
                this.errorService.procesarError(error);
            })
            .subscribe(dbObject -> {
                log.info("Objeto registrado en BD {}", dbObject);
            })  
        )
}
 

Когда я выполняю модульный тест для этого метода:

 @Test
public void shouldSaveDocumentoSendAnErrorEventWhenAnUnexpectedErrorHappens() {

    doReturn(Mono.error(Throwable::new)).when(this.zipService)
            .getObject(anyString());

    this.service.process(anotherObject);

    verify(this.errorService, times(1)).processError(anyObject());
}
 

Этот модульный тест всегда завершается неудачей. Но когда я выполняю отладку в режиме реального времени и имитирую ошибку, вызывается метод processError (код потока вводится в метод doOnError), поэтому я полагаю, что я неправильно выполняю модульный тест.

Итак, каков был бы правильный способ написания модульного теста?

Заранее спасибо.

Редактировать

Я попытался упростить свой метод и забыл его в последней части. В финале метода я делаю suscribe() . В этой части я вызываю службу, отвечающую за транзакции БД. Ну … модульный тест также не работает с текущей версией моего метода

Комментарии:

1. какой тип возвращаемого processError значения?

2. на самом деле, ничто не подписывается на Mono созданный в process() и с реактором, ничего не происходит, пока вы не подпишетесь

3. как уже упоминалось public void process(AnotherObject anotherObject) , ничего не возвращает. В reactor вам нужно подписаться на monos или fluxes, чтобы они действительно выполнялись. Это объясняется в getting started section документации по реактору projectreactor.io/docs/core/release/reference /…

4. Я обновил свой вопрос. Я забыл, что это часть моего метода @Toerktumlare

5. У вас есть как a suscribe , так и a subscribe в приведенной выше функции… он не компилируется