【问题标题】:Replace spring bean in one context with mock version from another context用另一个上下文中的模拟版本替换一个上下文中的 spring bean
【发布时间】:2012-10-09 13:07:59
【问题描述】:

我正在编写一个集成测试,其中应用程序上下文 xml 在启动期间被初始化。测试类中有几个测试方法使用特定的 bean 'X'(已经在 xml 中定义)。我的实际要求是仅针对其中一种测试方法模拟 bean X。

在测试方法中:我尝试使用 ClassPathXMLApplicationContext 创建一个单独的应用程序上下文,其中只有模拟 bean 'M'。

现在我有两个应用程序上下文 (AC): 1. 在测试用例启动期间创建的一个(包含实际的 bean X)和 2. 在测试方法中使用 ClassPathXMLApplicationContext 创建的一个(具有模拟 bean M)。

我想使用 AC:2 中的模拟 bean 定义“M”替换 AC:1 中的实际 bean 定义“X”。

有人可以解释一下吗?

【问题讨论】:

    标签: spring testing mocking javabeans context.xml


    【解决方案1】:

    你可以:

    • 如果你有spring 3.1,使用Profile注解。
    • 使用Primary注解
    • 使用qualifiers
    • 在 spring 上下文中自己连接 bean

    我相信还有更多选择。

    【讨论】:

    • Primary 正是我想要的。谢谢!
    • @Primary 是最佳答案:“表示当多个候选人有资格自动装配时,应优先考虑一个 bean (...)”
    • 对我来说 \@Primary 也是最好的答案,但是当使用 \@Qualifier 时会发生什么?
    • 真的很喜欢@Primary 的建议。这在特殊的测试场景中非常有用...
    【解决方案2】:

    除非您将其关闭并再次刷新,否则没有明确的方法可以替换刷新后的 ApplicationContext 中的 bean。

    为了模拟它,常用方法是使用要替换的 bean 的 Proxy,并在运行时更改目标。

    您可以使用框架 aop 支持类轻松做到这一点:

    <bean id="realBean" class="RealClass" />
    <bean id="mockBean" class="MockClass" />
    <bean id="targetSource" class="org.springframework.aop.target.HotSwappableTargetSource">
        <constructor-arg ref="realBean" />
    </bean>
    
    <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="targetSource" ref="targetSource" />
    </bean>
    

     

    @Test
    public void testWithMockBean() {
    Object real = targetSource.swap(mock);
    ....
    // do your test work
    ...
    targetSource.swap(real);
    
    }
    

    【讨论】:

    【解决方案3】:

    创建一个testApplicationContext
    <beans>
        <import resource="classpath*:appContext.xml" />
        <bean id="mockbeanOfX" class=....../>
    </beans>
    

    然后在您的测试用例中加载这个测试应用程序上下文。现在您可以从应用程序上下文中获取模拟 bean 并将其传递到任何需要的地方。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多