#java #class #exception #junit5
Вопрос:
У меня есть следующая идентичная строка assertThrows в двух тестах:
Assertions.assertThrows(HttpServerErrorException.BadGateway.class, (Executable) restTemplate.postForEntity(builder.toUriString(), request, String.class));
Один из тестов проходит, а другой выдает эту ошибку:
java.lang.ClassCastException: класс org.springframework.http.ResponseEntity не может быть приведен к классу org.junit.jupiter.api.функция.Исполняемый файл (org.springframework.http.ResponseEntity и org.junit.jupiter.api.функция.Исполняемый файл находится в безымянном модуле загрузчика «приложение»)
Кто-нибудь знает, почему это может быть так? Почему я могу привести ResponseEntity к исполняемому классу для одного теста, а не для другого?
Комментарии:
1. Можете ли вы добавить скриншот оценки отладки того, что вы пытаетесь выполнить в обоих случаях? Я чувствую, что прохождение теста возвращает значение null, и это объясняет, почему вы можете его использовать
Ответ №1:
Пожалуйста, попробуйте так:
Assertions.assertThrows(HttpServerErrorException.BadGateway.class, () -> restTemplate.postForEntity(builder.toUriString(), request, String.class));
На данный момент ты делаешь это так:
public <T> ResponseEntity<T> postForEntity(...)
возвращает ResponseEntity
, а затем вы приводите его к Executable
интерфейсу smth, как:
ResponseEntity<?> responseEntity = new ResponseEtity<>(...);
Executable ex = (Executable) responseEntity; // ClassCastException
Executable
является функциональным интерфейсом, и вы должны передать параметр lambda, т. е. реализацию Executable
интерфейса в assertThrows
методе.
Комментарии:
1. Проблема была решена по-другому, поскольку другой класс приводил к тому, что объект запроса не содержал нужного содержимого, но эта информация очень ценна для моего понимания вещей и, вероятно, будет полезна в будущем. Огромное вам спасибо!
2. В любом случае, вам не следует выполнять приведение там, а использовать лямбду. Вы проводите кастинг
Executable
ResponseEntity
, хотя ниResponseEntity
один из его суперклассов, ни его суперклассы не реализуют этот интерфейс. Ваш код в одном методе тестирования работает только потому, что вашpostForEntity(...)
метод возвращаетnull
.