#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
, так и asubscribe
в приведенной выше функции… он не компилируется