目前Spring支持:
- 传统的基于xml的配置方式, 一般使用bean标签配置bean
- JavaConfig 和Annotation-Driven的配置方式:启动注解驱动方式需要在xml文件中声名 <context:annotation-config/>,以扫描注解配置的component。
- @Configuration: 对类注解,指明类会被JavaConfig 作为bean的定义的来源。
见: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html
在基于maven的ssm项目中,混合使用了<context:annotation-config/>和 @Configuration两种配置bean的方式,在使用junit做单元测试时,必须同时导入两种配置(context)
否则会报错:
java.lang.IllegalStateException: Failed to load ApplicationContext
......
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException NoSuchBeanDefinitionException
@ContextConfiguration内的属性声名:
@AliasFor("value")
String[] locations() default {};
Class<?>[] classes() default {};
使用locations表明配置文件xml的位置,classes表明JavaConfig的配置类,但因为内部实现原因不可同时使用这两种方式。
若要正常测试,需要做一个迂回:
在test下,创建一个导入xml配置文件的类,并用@Configuration注解
@Configuration
@ImportResource({"classpath:context-1.xml", "classpath:context-2.xml"})
class TestConfig {
}
再统一使用classes包含所有context:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SomeConfiguration.class, TestConfig.class})
public class RunRuleServiceTest {
//
//
}
解决方案如上