我有一个连接到某些jms消息代理的spring web应用程序,现在我在从Spring 3.2.16迁移到Spring 4.2.4.RELEASE后发现测试错误和失败。
以下错误是我在使用JmsTemplate进行单元测试后更改弹簧版本后的错误。
org.springframework.context.support.GenericApplicationContext@12eec522 has not been refreshed yet
测试类的配置如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:beans.xml"})
public class JMSMiscUtilTest {
最终,这个类中有多个单元测试,还有一些其他类似的类测试代码尝试使用GenericApplicationContext注册bean。
这些方法调用GenericApplicationContext (JmsTemplate的)genericContext.getBean(位置);
然后尝试像这样注册bean:
final BeanDefinitionBuilder bDBuilder = BeanDefinitionBuilder
.rootBeanDefinition("org.springframework.jms.core.JmsTemplate");
genericContext.registerBeanDefinition(location,
bDBuilder.getBeanDefinition());
在我看来,这些测试尝试使用它在bean定义构建器中注册的bean,然后才能完成注册它尝试加载到genericApplicationContext中的所有bean。
这必须在春季3允许,但不允许4.
如何重构此代码以继续使用GenericApplicationContext,或采用不同的方法?
________编辑:____________
该应用程序还有许多用XML定义的bean,我仍然需要整个应用程序的运行时间。调用context.refresh()就像错误指示修复了“尚未刷新”错误,但是当应用程序随后尝试使用XML中定义的某个bean时,它会抛出一个错误,因为它被擦除了它不存在来自.refresh调用的上下文。
答案 0 :(得分:1)
在动态注册bean之后,你必须在再次访问上下文之前调用context.refresh()。
因此,在调用registerBeanDefinition(..)之后,也调用context.refresh()。
就我而言,这种行为并没有从Spring 3变为4。
确实可能改变的是在每个测试方法或测试类之后spring如何/何时刷新上下文的方式。
您可以尝试使用@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)