Тестовый код, который выдает и регистрирует WebClientResponseException.NotFound: org.springframework.http.HttpStatusCodeJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Тестовый код, который выдает и регистрирует WebClientResponseException.NotFound: org.springframework.http.HttpStatusCode

Сообщение Anonymous »

Я выполняю модульное тестирование следующего кода, который имеет условие создания и регистрации исключения org.springframework.web.reactive.function.client.WebClientResponseException.NotFound:

Код: Выделить всё

@RestController
public class MyController {

private final Logger log = LoggerFactory.getLogger(this.getClass());

@Autowired
private MyService service;

@GetMapping(path = "/perform")
public ResponseEntity perform() {

ResponseDTO response = null;

try {

response = service.perform();

} catch (WebClientResponseException.NotFound wcreNotFound) {

log.error("Could not fetch: ", wcreNotFound);
response = new ResponseDTO();
response.setInfo(..);
}

return new ResponseEntity(response, HttpStatus.OK);
}
Модульный тест с Mockito:

Код: Выделить всё

@Test
public void testCondition() throws Exception {
when(service.perform()).thenThrow(WebClientResponseException.NotFound.class);
ResponseEntity result = controller.perform();
assertEquals(...);
}
Когда я запускаю этот модульный тест, в строке log.error возникает исключение NullPointerException из-за отражения исключения WebClientResponseException, получающего NULL HttpStatusCode как часть проверки HttpStatusCode.is1xxInformational().

Код: Выделить всё

Caused by: java.lang.NullPointerException: Cannot invoke
"org.springframework.http.HttpStatusCode.is1xxInformational()" because
"this.statusCode" is null
at org.springframework.web.reactive.function.client.WebClientResponseException.shouldHintAtResponseFailure(WebClientResponseException.java:285)
at org.springframework.web.reactive.function.client.WebClientResponseException.getMessage(WebClientResponseException.java:278)
at java.base/java.lang.Throwable.getLocalizedMessage(Throwable.java:397)
at java.base/java.lang.Throwable.toString(Throwable.java:496)
Итак, у меня есть 2 варианта:
  • Заставить Mockito имитировать исключение WebClientResponseException с правильным значением HttpStatus, заполненным в thenobject. Но это не работает:
А. Если я сделаю это:

Код: Выделить всё

when(service.perform()).thenThrow(new WebClientResponseException(404, null, null, null, null));
=> это не соответствует моему улову WebClientResponsException.NotFound в коде. Очевидно, NotFound не создан для исключения WebClientResponseException, созданного с 404 в качестве первого значения.
B. Невозможно также создать исключение NotFound — во всех случаях синтаксическая ошибка:

Код: Выделить всё

when(service.perform()).thenThrow(new WebClientResponseException.NotFound(404, null, null, null, null));

Код: Выделить всё

when(service.perform()).thenThrow(new WebClientResponseException.NotFound());
Эти примеры предназначены для заполнения отсутствующего HttpStatus в выдаваемом исключении Mockito.
  • Подавление ведения журнала:
Я также мог бы подавить ведение журнала, но не знаю, как использовать doNothing без объекта журнала, на который можно ссылаться в JUnit. Объект журнала существует только в тестируемом коде. Я не могу выполнить doNothing().when(log...) в jUnit.
Я не хочу уменьшать или удалять журналирование модульных тестов; регулярная регистрация из jUnits все равно должна происходить. Мне просто нужно подавить конкретную регистрацию того, что я моделирую и ожидаю здесь.

Подробнее здесь: https://stackoverflow.com/questions/798 ... g-springfr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»