在一个上下文中用另一个上下文中的模拟版本替换spring bean

时间:2012-10-09 13:07:59

标签: spring testing mocking javabeans context.xml

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

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

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

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

有人可以对此有所了解吗?

3 个答案:

答案 0 :(得分:23)

你可以:

    如果你有春季3.1,
  • 使用Profile注释。
  • 使用Primary注释
  • 使用qualifiers
  • 在春天环境中自己连接豆子

我确信还有更多选择。

答案 1 :(得分:17)

除非您关闭它并再次刷新,否则没有一种明确的方法可以替换刷新的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);

}

答案 2 :(得分:3)

使用

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

然后在测试用例中加载此测试应用程序上下文。现在,您可以从应用程序上下文中获取mock bean,并在需要时传递它。