В моих старых проектах конфигурации XML я мог сделать следующее в своих конфигурациях
mvc-context.xml
<context:component-scan base-package="com.foo" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
<mvc:annotation-driven/>
service-context.xml
<context:spring-configured />
<context:annotation-config />
<context:component-scan base-package="com.foo" >
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
в моих тестах я мог бы сделать следующее
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextHierarchy(value = {
@ContextConfiguration(classes = { MockServices.class }),
@ContextConfiguration({ "classpath:/META-INF/spring/mvc-servlet-context.xml" }),
})
public class FooControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mvc;
@Before
public void setUp() throws Exception {
mvc = webAppContextSetup(wac).build();
}
}
и затем я мог бы запускать тесты с моей конфигурацией MVC, не загружая свои сервисы и репозитории JPA, и вместо этого иметь мои макеты @Autowired
в моих контроллерах.
Однако приложения Spring Boot имеют следующую конфигурацию основного контекста.
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
}
Этот @ComponentScan
, очевидно, находит все @Controller
, @Service
и т. д.
если бы я сейчас попытался проверить свой контекст MVC, я бы загрузил нежелательные сервисы и репозитории.
То, что я пытался сделать, это создать 2 новые конфигурации
Mvc.java
@Configuration
@ComponentScan(basePackages = { "com.foo" }, useDefaultFilters = false, includeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)} )
@Order(2)
public class Mvc {
}
Services.java
@Configuration
@ComponentScan(basePackages = { "com.foo" }, useDefaultFilters = false, excludeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)} )
@Order(1)
public class Services {
}
Однако это не работает, когда я пытаюсь запустить свое приложение, я получаю @Autowire
ошибок No qualifying bean of type
Я иду об этом неправильно?
Как мне сделать так, чтобы я мог запускать тесты в моем контексте MVC без потери времени на загрузку JPA EntityManagers, Spring Data Repositories и т. д.?
useDefaultFilters
из классаServices
. Также вам действительно нужен контекст, если все, что вы хотите сделать, это протестировать контроллер, просто создайте экземпляр самостоятельно и смоделируйте службы, необходимые в вашем модульном тесте, и/или используйте Spring Test MockMVC для тестирования ваших контроллеров. - person M. Deinum   schedule 24.10.2014useDefaultFilters
иexcludeFilters
контроллеры будут загружаться дважды? использованиеMockMvcBuilders.standaloneSetup
приемлемо, за исключением того, что оно не будет включать в себя все остальные вещи, используемые MVC, например,ControllerAdvice
,ExceptionResolvers
,ConversionServices
и т. д. Вот почему я хочу использоватьMockMvcBuilders.webAppContextSetup
. Я обновил приведенный выше код, чтобы показать, что - person kabal   schedule 24.10.2014