Spring 4升级现在junit测试失败了“GenericApplicationContext还没有刷新”?

时间:2016-03-20 00:30:07

标签: java spring maven junit jms

我有一个连接到某些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调用的上下文。

1 个答案:

答案 0 :(得分:1)

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

因此,在调用registerBeanDefinition(..)之后,也调用context.refresh()。

就我而言,这种行为并没有从Spring 3变为4。 确实可能改变的是在每个测试方法或测试类之后spring如何/何时刷新上下文的方式。 您可以尝试使用@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)

更改此设置