TestRestTemplate создает исключение для кодов состояния 4xx - PullRequest
0 голосов
/ 14 февраля 2019

Я пишу тесты компонентов для приложения Spring-Boot, чтобы проверить мою конфигурацию безопасности.Поэтому я запускаю тесты, которые должны проверять как успешные ответы, так и статус «запрещенный».Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку мой вызов REST ожидает сложный JSON, для заблокированных вызовов тесты не выполняются, поскольку TestRestTemplate пытается десериализовать тело ответа, которого там нет.

Я запускаю Spring-Bootприложения, а класс тестов помечается:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

Я пытаюсь протестировать REST API, который должен возвращать список пользователей.Упрощенная версия вызова будет выглядеть следующим образом:

ResponseEntity<List<User>> responseEntity  = testRestTemplate.exchange(URL, HttpMethod.GET, entity, new ParameterizedTypeReference<List<User>>() {});

, где TestRestTemplate автоматически подключается Spring, а объект содержит информацию об авторизации.

Для неавторизованного запроса я получаю сообщение об ошибке, подобное:

org.springframework.web.client.RestClientException: Error while extracting response for type [java.util.List<my.package.User>] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
 at [Source: (PushbackInputStream); line: 1, column: 1]

Если я изменяю объект ответа, чтобы получить String вместо List, я получаю ответ и могу проверить статус и увидеть, что он "запрещен"

ResponseEntity<String> responseEntity  = testRestTemplate.exchange(URL, HttpMethod.GET, null, String.class);

Iзнаю, что я могу обойти это следующим образом:

  • Использование String и десериализация с Gson, или
  • Использование RestTemplate вместо TestRestTemplate и обработка исключения HttpStatusCodeException или
  • Методы переопределенияне пытаться десериализовать, когда код состояния не 2xx

, но так как TestRestTemplate должен быть отказоустойчивым вспомогательным подклассом, я бы ожидал, что он из коробки не попытаетсядесериализовать ответ об ошибке.

Я что-то здесь упускаю?Я использую это неправильно?

Ответы [ 2 ]

0 голосов
/ 29 августа 2019

Я ожидаю, что реализация ResponseErrorHandler поможет вам обойти это.

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

Источник: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/HttpClientErrorException.html

Исключение, выдаваемое при получении HTTP 4xx.

Для реализации ResponseErrorHandler см. https://www.baeldung.com/spring-rest-template-error-handling

0 голосов
/ 22 февраля 2019

Возможно, я не понял проблему, но почему вы не уловили исключение с помощью класса RestClientException.Если это не так, вам нужно попробовать обходные пути, о которых вы упомянули.

...