有没有办法在Spring中覆盖测试超类的@ActiveProfile
设置?
这是我的配置:
<beans profile="integration">
<bean class="org.easymock.EasyMock" factory-method="createMock">
<constructor-arg value="com.mycompany.MyInterface" />
</bean>
</beans>
<beans profile="production,one-off-test">
<bean class="com.mycompany.MyInterfaceImpl" />
</beans>
所有测试的超类看起来像这样:
@ActiveProfiles("integration")
public abstract class TestBase {
在我的新测试课程中,我想这样做:
@ActiveProfiles("one-off-test")
public class MyTest extends TestBase {
不继承TestBase并不是一个真正的选择。 当我尝试运行它时,我得到的错误是:
No qualifying bean of type [com.mycompany.MyInterface] is defined: expected single matching bean but found 2
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.mycompany.MyInterface] is defined: expected single matching bean but found 2: org.easymock.EasyMock#1,com.mycompany.MyInterfaceImpl#0
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:970)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 46 more
更好的是能够对配置文件进行分层,这样如果存在用于配置文件one-off-test
的bean,则注入该配置文件,否则注入integration
配置文件bean。
任何帮助都将受到高度赞赏。
答案 0 :(得分:6)
您可能需要通过系统属性指定活动配置文件:
-Dspring.profiles.active="integration"
如果您想使用相关的bean实现或
-Dspring.profiles.active="one-off-test"
使用一次性测试个人资料bean。
然后,您必须将inheritProfiles
注释属性设置为false
,这将阻止当前带注释的测试用例放弃子类配置文件:
@ActiveProfiles(profiles = {"one-off-test"}, inheritProfiles= false)
public class MyTest extends TestBase {}
答案 1 :(得分:0)
您提出的问题的一个解决方案是使用primary
,如下所示:
<beans profile="integration">
<bean class="org.easymock.EasyMock" factory-method="createMock" primary=true>
<constructor-arg value="com.mycompany.MyInterface" />
</bean>
</beans>
您不需要更改任何其他内容,因为Spring将使用类型为integration
的bean的配置文件MyInterface
中的bean。尽管存在多种类型的bean,但Spring仍然这样做。
查看this,其中提供了有关primary
工作原理的更多详细信息。