SpringApplicationContextLoader
假定应用程序使用100%XML或100%Java配置。这是因为@ContextConfiguration
允许列表或位置/值,而不是两者。如果指定了any,SpringApplicationContextLoader
将忽略创建并启动SpringApplication的Application类。
尝试使用100%Groovy / no-XML宠物项目启动Boot,我遇到了上述问题。我的Application类上有@EnableAutoConfiguration
和@ComponentScan
注释,前者需要Boot来设置Web服务器。后来我因为SPR-11627而不得不保留。另一方面,如果我省略@ContextConfiguration
上的位置/值,则不会设置依赖关系(呃!)。
我将以下代码与我在SpringApplicationContextLoader
本地制作的补丁一起提供。如果有更好的方法,请告诉我。
MovieDatabaseRESTClientIntegrationTest.groovy
RunWith(SpringJUnit4ClassRunner)
@ContextConfiguration(value = ['classpath:client-config.groovy', 'classpath:integ-test-config.groovy'],
loader = PatchedSpringApplicationContextLoader)
@SpringApplicationConfiguration(classes = MovieDatabaseApplication)
@WebAppConfiguration
@IntegrationTest
class MovieDatabaseRESTClientIntegrationTest {
MovieDatabaseApplication.groovy
@EnableAutoConfiguration
@ComponentScan
class MovieDatabaseApplication {
SpringApplicationContextLoader.java修复
private Set<Object> getSources(MergedContextConfiguration mergedConfig) {
Set<Object> sources = new LinkedHashSet<Object>();
sources.addAll(Arrays.asList(mergedConfig.getClasses()));
sources.addAll(Arrays.asList(mergedConfig.getLocations()));
/* The Spring application class may have annotations on it too. If such a class is declared on the test class,
* add it as a source too. */
SpringApplicationConfiguration springAppConfig = AnnotationUtils.findAnnotation(mergedConfig.getTestClass(),
SpringApplicationConfiguration.class);
if (springAppConfig != null) {
sources.addAll(Arrays.asList(springAppConfig.classes()));
}
if (sources.isEmpty()) {
throw new IllegalStateException(
"No configuration classes or locations found in @SpringApplicationConfiguration. "
+ "For default configuration detection to work you need Spring 4.0.3 or better (found "
+ SpringVersion.getVersion() + ").");
}
return sources;
}
也发布在Spring论坛上。
答案 0 :(得分:1)
我可能错了,但我认为beans{}
中的@ContextConfiguration
配置没有任何支持,@SpringContextConfiguration
只是对此的扩展。 JIRA中的功能请求是合适的。此外,从未有过对混合配置格式的支持(至少作为入口点) - 您始终必须选择XML或@Configuration
,否则提供您自己的ContextLoader
。您也不应该在同一个类上同时拥有@ContextConfiguration
和@SpringContextConfiguration
(行为未定义)。