您将如何进行集成测试注释配置和组件扫描的Spring应用程序,并且根本没有XML配置?我需要用测试组件替换生产组件而不需要实际使用xml配置或反射注入到所有@autowired部件。
示例:
interface A {...}
@Component
class AImpl implements A {
...
}
interface B {...}
@Component
class BImpl implements B {
@Autowired A a;
...
}
interface C {...}
class CImpl implements C {
@Autowired B b;
...
}
然后在我的测试中我想使用ATestImpl,但我只能访问C(集成测试C)。
你会怎么做呢?
答案 0 :(得分:10)
利用@Primary
注释:
@Service
@Primary
public class TestA implements A {
//...
}
如果有多个bean实现A
,Spring会更喜欢用@Primary
注释的bean。如果您将TestA
类放在/src/test/java
中,它将仅在测试执行期间被选中,在正常上下文启动时,Spring将看不到TestA
并仅使用avaialble AImpl
。
答案 1 :(得分:2)
使用专用的spring上下文XML文件,您可以使用AImpl
的实例覆盖ATestImpl
。当然,它使用XML,但我没有看到任何其他解决方案(除了使用ATestImpl
带注释的类而不是AImpl
类重新打包应用程序)
答案 2 :(得分:1)
Spring 3.1中新的Bean Profile功能解决了通过定义配置文件来交换注入组件进行测试的需要,例如:测试,生产等。
博文的链接是here。 Spring团队今天发布了Spring 3.1的第二个里程碑版本。
答案 3 :(得分:1)
您可以对测试使用特殊组件扫描,排除“普通”类并添加测试类。
如果您有多个不同的测试类,那么它们不应该有@Component
注释(或@Service,...)。相反,它们应该是{Bean}声明的loaded
。因此,您可以为不同的设置使用不同的XML文件。
<context:component-scan base-package="com.queomedia.sgcrm.base">
<context:exclude-filter expression="com\.example\.AImpl" type="regex"/>
</context:component-scan>
<bean class="com.example.ATestImpl"/>
答案 4 :(得分:1)
使用Spring注释配置类,将@Bean方法编码为接口。 prod配置可以在高级包上执行组件扫描以加载prod对象,测试配置可以单独指定bean以返回对象的测试版本。这对于需要伪造服务调用和DAO对象的组件测试非常有效。