我知道有类似的问题,例如here,但在进行了搜索后,我找到了一个解决方案,我对here
感到非常满意然而,我唯一的问题是,我不确定如何实施此解决方案。
我希望能够通过HotswappableTargetSource覆盖我的应用程序上下文中的选择bean的bean定义,然后运行测试。
然后,对于每个测试用例,我想指定哪些bean我想要热插拔,然后每个测试必须能够创建自己的模拟版本并交换它们,并且能够再次交换。
我能够获得运行测试的应用程序上下文,但我不知道如何配置bean可热插拔。我知道如何在使用xml配置bean时这样做,但我不想回到使用xml来配置bean。
答案 0 :(得分:9)
更新:有一个库可以做到!
https://bitbucket.org/kubek2k/springockito/wiki/springockito-annotations
解决方案如下:
您需要更改应用程序的spring上下文以代理要交换的bean:
<bean id="beanSwappable" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource" ref="beanSwap" />
</bean>
<bean id="beanSwap" class="org.springframework.aop.target.HotSwappableTargetSource">
<constructor-arg ref="beanToSwap" />
</bean>
因此,需要对被测系统进行更改。
在您的测试中,代码将如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "test.xml", "spring.xml" })
public class Test {
@Resource(name="beanSwappable")
Bean b;
@Resource(name = "beanSwap")
HotSwappableTargetSource beanSwap;
public void swap() {
Bean b = << create mock version >>
beanSwap.swap(b);
// run test code which
}
}