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

Ram*_*Ram 11 testing spring mocking javabeans context.xml

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

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

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

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

请问有人对此有所了解吗?

G-M*_*Man 23

您可以 :

  • 如果你有spring 3.1,请使用Profile注释.
  • 使用Primary注释
  • 使用限定符
  • 在春天的背景下自己连接豆子

我相信还有更多的选择.

  • **@ Primary**是最佳答案:"表示当多名候选人有资格自动装配时,应优先考虑豆子(......)" (2认同)

Jos*_*tin 17

ApplicationContext除非您关闭它并再次刷新,否则没有一种明确的方法可以替换刷新的bean .

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

您可以使用框架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>
Run Code Online (Sandbox Code Playgroud)

 

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

}
Run Code Online (Sandbox Code Playgroud)