SpringApplicationContextLoader
假定應用程序使用100%XML或100%Java配置。這是因爲@ContextConfiguration
允許一個類或位置/值的列表,而不是兩個。如果指定了任何值,SpringApplicationContextLoader
將忽略創建並啓動SpringApplication的Application類。SpringApplicationContextLoader忽略應用程序類
試圖使用100%Groovy/no-XML寵物項目進行引導,我遇到了上述問題。我的應用程序類有@EnableAutoConfiguration
和@ComponentScan
註解,前者需要Boot來建立一個Web服務器。後來我不得不保留,因爲SPR-11627。另一方面,如果我省略了@ContextConfiguration
上的位置/值,則不建立依賴關係(duh!)。
我給出了下面的代碼以及我在本地製作的補丁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論壇上。
'beans {}'實際上有一些支持。 GroovyBeanDefinitionReader被調用,它在閱讀簡單文件方面做得很好。目前有一個JIRA開放[SPR-11233](https://jira.spring.io/browse/SPR-11233)提供一流的支持。 因爲這個bug [spring-boot-603](https://github.com/spring-projects/spring-boot/issues/603),我不得不使用'@ ContextConfiguration'和'@ SpringContextConfiguration'。我提交了拉請求。 –
更具體地說,'SpringApplicationContextLoader'不會設置Web配置,除非它找到'@ SpringContextConfiguration'。另一方面,它不支持從'beans {}'加載,所以我也被迫使用'@ ContextConfiguration'。 –
實際上'SpringApplicationContextLoader'不支持'beans {}'的加載,但是你不能混合'classes ='和'locations ='。這是出於歷史原因,並沒有理由不能工作,但它不是一個啓動功能,因爲它與底層的Spring Test實現綁定在一起。 –