2016-03-20 138 views
1

我有一个连接到一些jms消息代理的spring web应用程序,现在从Spring 3.2.16迁移到Spring 4.2.4.RELEASE后发现测试错误和失败。Spring 4现在升级junit测试失败“GenericApplicationContext尚未刷新”?

下面的错误是我现在正在使用JmsTemplate在单元测试中更改弹簧版本后得到的。

[email protected]eec522 has not been refreshed yet 

的测试类被配置像这样:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:beans.xml"}) 
public class JMSMiscUtilTest { 

最终,有在该类中的多个单元测试和测试代码,它试图用GenericApplicationContext注册豆几个其他类似的类。

这些方法调用GenericApplicationContext (JmsTemplate)genericContext.getBean(location);

,随后试图注册豆类,像这样:

final BeanDefinitionBuilder bDBuilder = BeanDefinitionBuilder 
       .rootBeanDefinition("org.springframework.jms.core.JmsTemplate"); 
genericContext.registerBeanDefinition(location, 
       bDBuilder.getBeanDefinition()); 

在我看来,这些试验尝试使用豆类它与bean定义建设者注册之前它完成注册所有的bean,尝试加载到genericApplicationContext中。

这必须被允许在春季3,但不是4

我如何重构这个代码仍然使用GenericApplicationContext,或者采取不同的方法?

________编辑:____________

该应用程序还具有在XML定义了很多豆子,我仍然需要通过从应用程序的整个运行时间。像错误一样调用context.refresh()表明修复了“未被刷新”的错误,但是当应用程序随后尝试使用XML中定义的其中一个bean时,它会抛出一个错误消息,因为它已被擦除来自.refresh调用的上下文。

回答

0

在动态注册bean之后,必须在再次访问上下文之前调用context.refresh()。

因此,在您调用registerBeanDefinition(..)之后,还需要调用context.refresh()。

就目前而言,这种行为并没有从春季3变为4. 确实可能发生了什么变化是春季在每种测试方法或测试类后如何刷新上下文的方式。 你可以尝试改变这个使用@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)

+0

是的,但是它是真的,context.refresh()总是会清理整个应用程序上下文?我不能只调用.refresh()的原因是因为应用程序还加载了一堆用XML定义的bean。因此,当我使用.refresh时,它加载了在上下文上动态注册的bean,但它也删除了之前加载的每个我以前需要的XML。有什么办法可以解决这个问题吗? –

+0

另外应该提一下,我试过@DirtiesContext注解。不解决问题,因为测试不是使用通用上下文来注册新的bean,而是测试调用的方法。 –