8

我知道有人问过类似的问题,例如在这里,但是在进行了搜索后,我找到了一个让我更满意的解决方案

但是,我唯一的问题是我不确定如何实施此解决方案。

我想要做的是通过 HotswappableTargetSource 用我的测试版本覆盖我的应用程序上下文中选择 bean 的 bean 定义,然后运行测试。

然后对于每个测试用例,我想指定哪些 bean 可以热插拔,然后每个测试必须能够创建自己的模拟版本并将其交换,并且能够再次交换回来。

我能够获得运行测试的应用程序上下文,但我不知道如何将 bean 配置为可热插拔。我知道在使用 xml 配置 bean 时该怎么做,但我不想回到使用 xml 来配置 bean。

4

1 回答 1

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>
  • beanSwap 是这个 beanSwap 的代理。
  • beanSwappable 是您想要交换 bean 时引用的 bean
  • 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

    }
}
于 2010-11-29T10:55:33.723 回答