代码之家  ›  专栏  ›  技术社区  ›  Michael Wiles

将模拟bean注入spring上下文中进行测试

  •  8
  • Michael Wiles  · 技术社区  · 15 年前

    我知道有人问过类似的问题。 here ,但是在做了一次调查之后,我找到了一个解决方案 here

    然而,我唯一的问题是,我不知道如何实现这个解决方案。

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

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

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

    1 回复  |  直到 9 年前
        1
  •  9
  •   Michael Wiles    13 年前

    更新:有一个图书馆能做到!

    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
    
        }
    }
    
    推荐文章