две одинаковые строки assertThrows ведут себя по-разному

#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 .