在将 Spring Framework spring-test 依赖项从 4.2.9 升级到 4.3.9 后,我在运行集成测试时遇到了一些问题。
我正在使用一个 ContextConfiguration 类,它实现了 spring 测试SmartContextLoader
,它允许我加载由配置文件拆分的不同 .xml 配置文件。根据当前的 spring 配置文件,它将运行该配置文件的特定 bean。
我ContextConfigurationLoader
在版本中运行得非常好,4.2.9
但是在升级到版本之后4.3
,我正在努力解决这个问题。
我包括ContextConfigurationLoader
我在集成测试中创建的,就像这样。
@ContextConfiguration(loader=ContextConfigurationLoader.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MyIntegrationTest {
// Test Body
}
长这样ContextConfigurationLoader
,
public class ContextConfigurationLoader implements SmartContextLoader {
@Override
public void processContextConfiguration(ContextConfigurationAttributes contextConfigurationAttributes) {
}
@Override
public ApplicationContext loadContext(MergedContextConfiguration mergedContextConfiguration) throws Exception {
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.getEnvironment().setActiveProfiles(mergedContextConfiguration.getActiveProfiles());
new XmlBeanDefinitionReader(context).
loadBeanDefinitions(mergedContextConfiguration.getLocations());
context.load(
"/development.xml",
"/staging.xml",
"/production.xml",
);
AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
context.refresh();
context.registerShutdownHook();
return context;
}
@Override
public String[] processLocations(Class<?> aClass, String... strings) {
return new String[0];
}
@Override
public ApplicationContext loadContext(String... strings) throws Exception {
ApplicationContext context = ApplicationContextFactory.create();
context.getBean("dbUnitDatabaseConnection");
return ApplicationContextFactory.create();
}
}
最后,这是我尝试运行测试后得到的错误响应。
java.lang.IllegalStateException: ContextConfigurationLoader was unable to detect defaults, and no ApplicationContextInitializers or ContextCustomizers were declared for context configuration attributes [[ContextConfigurationAttributes@53ca01a2 declaringClass = 'com.class.path.to.MyIntegrationTest', classes = '{}', locations = '{}', inheritLocations = true, initializers = '{}', inheritInitializers = true, name = [null], contextLoaderClass = 'com.class.path.to.ContextConfigurationLoader']]
感谢您的帮助,如果您需要更多信息,请告诉我。
我发现的一种解决方案是将所有 .xml 配置文件包含在一个文件中并使用这样的@ContextConfiguration
注释。
@ContextConfiguration("/config.xml")
但这需要对测试之外的其余代码进行一些其他更改。这也无助于解释为什么我当前的实现在最新的 Spring Framework 弹簧测试版本上不起作用。