gpt4 book ai didi

java - Spring 4 升级现在 junit 测试在 "GenericApplicationContext has not been refreshed yet"上失败?

转载 作者:行者123 更新时间:2023-11-30 07:31:13 25 4
gpt4 key购买 nike

我有一个 Spring Web 应用程序,它连接到一些 jms 消息代理,现在从 Spring 3.2.16 迁移到 Spring 4.2.4.RELEASE 后发现测试错误和失败。

下面的错误是我在使用 JmsTemplate 的单元测试中简单更改 spring 版本后遇到的错误。

 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());

在我看来,这些测试尝试在完成注册它尝试加载到 genericApplicationContext 中的所有 bean 之前使用它在 bean 定义构建器中注册的 bean。

这在 Spring 3 中必须是允许的,但在 Spring 4 中不允许。

如何重构此代码以继续使用 GenericApplicationContext,或采用不同的方法?

________编辑:____________

该应用程序还具有许多在 XML 中定义的 bean,我在应用程序的整个运行期间仍然需要它们。像错误所示那样调用 context.refresh() 修复了“尚未刷新”错误,但是当应用程序随后尝试使用 XML 中定义的 bean 之一时,它会抛出一个错误,指出它不存在,因为它已被删除来自 .refresh 调用的上下文。

最佳答案

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

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

据我所知,这种行为从 Spring 3 到 4 并没有改变。实际上可能已经改变的是 spring 在每个测试方法或测试类之后刷新上下文的方式/时间。您可以尝试使用 @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)

更改此设置

关于java - Spring 4 升级现在 junit 测试在 "GenericApplicationContext has not been refreshed yet"上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com