我正在编写一个集成测试,其中在启动期间初始化应用程序上下文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'。
有人可以对此有所了解吗?
答案 0 :(得分:23)
答案 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,并在需要时传递它。