11

我正在编写一个集成测试,其中应用程序上下文 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”。

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

4

3 回答 3

23

你可以 :

  • 如果您有 spring 3.1,请使用Profile注释。
  • 使用主要注释
  • 使用限定词
  • 在 spring 上下文中自己连接 bean

我敢肯定还有更多选择。

于 2012-10-09T13:18:06.097 回答
17

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

 

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

}
于 2012-10-09T20:46:34.783 回答
3

创建一个 testApplicationContext

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

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

于 2012-10-09T17:23:59.540 回答