Исключить конфигурацию, когда @WebMvcTest в Spring Boot 1.4

У меня есть класс @SpringBootApplication в каталоге java/ (тот же пакет) и еще один класс @SpringBootApplication в test/ для насмешки над некоторыми автоматически подключенными bean-компонентами. Существует несколько тестов, и используемая конфигурация варьируется от теста к тесту.

И в тестовом классе

@RunWith(SpringRunner.class)
@WebMvcTest(RecApiServerController.class)

бросает

java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes [Generic bean: class [com.xxx.MockedTestConfig]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/..direction.../target/test-classes/com/xxx/MockedTestConfig.class], Generic bean: class [com.xxx.MyApplication]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/...direction.../target/classes/com/xxx/MyApplication.class]]

Я просто хочу проверить маршрутизацию контроллера.

Как я могу установить конкретную конфигурацию приложения?


person margincall    schedule 20.12.2016    source источник


Ответы (1)


В одном пакете не может быть двух @SpringBootConfiguration (@SpringBootApplication). @WebMvcTest автоматически ищет для вас источник конфигурации (см. документ). У вас может быть специальный @SpringBootConfiguration (или приложение) во вложенном пакете вашего теста, если вы хотите что-то настроить, но вы не можете иметь два в одном пакете.

Я не уверен, что документ очень четко говорит об этом, поэтому нам, вероятно, следует уточнить это.

В любом случае, пользовательский @SpringBootApplication и нарезка немного странные. @SpringMvcTest уже заботится о включении только необходимого. Если вы хотите имитировать некоторые bean-компоненты, вы не должны не определять это в файле @SpringBootApplication. Обычный @Configuration, который вы импортируете, подойдет. У нас также есть @MockBean, чтобы автоматически имитировать вещи для вас.

person Stephane Nicoll    schedule 20.12.2016
comment
Я изменил MockedTestConfig.class на обычный @Configuration и добавил classes = { MyApplication.class, MockedTestConfig.class } в @SpringBootTest, и все тесты работали нормально. Раньше этого не было, поэтому я изменил его на @SpringBootApplication. Я думаю, что порядок в classes в тот раз был неправильным. Спасибо. :) - person margincall; 20.12.2016