Моя цель - перенести приложение Spring Boot, ранее разработанное с Spring Boot 1.3, в новейшую версию Spring Boot 1.4. Приложение состоит из нескольких модулей maven, и только один из них содержит класс, аннотированный с помощью @SpringBootApplication
.Требуется ли @WebMvcTest аннотация @SpringBootApplication?
Одна часть миграции заключается в использовании аннотации @WebMvcTest
, чтобы эффективно тестировать контроллеры, и здесь возникает проблема.
Рассмотрите example application с страницы загрузки gigub Spring. @WebMvcTest
аннотация работает отлично, потому что, насколько я понимаю (после нескольких тестов), в основном пакете аннотируется класс @SpringBootApplication
. Обратите внимание, что я придерживаюсь той же концепции, что и в приведенном выше примере для моих собственных тестов @WebMvcTest
.
Единственное отличие, которое я вижу в своем приложении, классы контроллера расположены в отдельном модуле maven (без @SpringBootApplication
аннотированного класса), но с конфигурациями @Configuration и SpringBootConfiguration
. Если я не комментирую какой-либо класс с @SpringBootApplication
, я всегда получаю утверждение во время тестирования контроллера. Мое утверждение так же, как когда SampleTestApplication класс в приведенном выше примере изменен, чтобы иметь только @EnableAutoConfiguration
и @SpringBootConfiguration
аннотаций (@SpringBootApplication
нет):
getVehicleWhenRequestingTextShouldReturnMakeAndModel(sample.test.web.UserVehicleControllerTests) Time elapsed: 0.013 sec <<< FAILURE!
java.lang.AssertionError: Status expected:<200> but was:<404>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:54)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:81)
at org.springframework.test.web.servlet.result.StatusResultMatchers$10.match(StatusResultMatchers.java:664)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171)
at sample.test.web.UserVehicleControllerTests.getVehicleWhenRequestingTextShouldReturnMakeAndModel(UserVehicleControllerTests.java:68)
Как я должен иметь дело с этим? Должен ли я всегда иметь класс, аннотированный с помощью @SpringBootApplication, чтобы запускать тесты @WebMvcTest?
EDIT 1: Я сделал небольшой проект maven с двумя модулями и минимальной конфигурацией. Это here. Теперь я получаю исключение NoSuchBeanDefinitionException для репозитория, определенного в другом модуле. Если я настрою «полный» @SpringBootApplication - все в порядке.
EDIT 2: Я модифицировал небольшой тестовый проект с EDIT 1, чтобы дать оригинальную проблему. Я играл с разными аннотациями и добавил @ComponentScan в классе конфигурации, потому что я подозревал, что бобовые не зарегистрированы правильно. Тем не менее, я ожидаю, что только @Controller bean (определенный в @WebMvcTest (... class)) должен быть зарегистрирован на основе магии позади поведения @WebMvcTest.
EDIT 3: Spring Boot project issue.
Я получил свой небольшой проект, чтобы пройти тест. Не уверен, что этого достаточно, чтобы ответить на ваш вопрос, или если вам нужно переместить несколько классов, чтобы лучше представлять проблему. –
@ShawnClark, спасибо, что попробовали. Вы добавили '@ SpringBootApplication' в класс конфигурации. Может быть, я не был полностью ясен раньше, но этот трюк также работает для меня. Я ожидаю, что в моем модуле мне не нужно ставить '@ SpringBootApplication'. – tysonite