Я пишу тесты компонентов для приложения 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 должен быть отказоустойчивым вспомогательным подклассом, я бы ожидал, что он из коробки не попытаетсядесериализовать ответ об ошибке.
Я что-то здесь упускаю?Я использую это неправильно?