【问题标题】:injecting mock beans into spring context for testing将模拟 bean 注入 Spring 上下文进行测试
【发布时间】:2011-05-15 19:03:47
【问题描述】:

我知道有人问过类似的问题,例如here,但经过搜索,我找到了一个解决方案,我对here 感到更满意

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

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

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

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

【问题讨论】:

    标签: java unit-testing spring junit4 spring-aop


    【解决方案1】:

    更新:有一个库可以做到这一点!

    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
    
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多