gpt4 book ai didi

java - 在 Spring 上重新注册单例 bean

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:10 24 4
gpt4 key购买 nike

我有一个多模块项目,其中每个模块都有自己的单元测试,并为该模块的类提供模拟。

我正在尝试构建一个应用程序上下文,其中每个模块都可以定义自己的模拟,但稍后的单元测试将能够覆盖这些模拟,例如:

public class Test {

private static final class StupidMock {
}

@org.junit.Test
public void test() {
StaticApplicationContext applicationContext = new StaticApplicationContext();
final ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory();
StupidMock stupidMock = new StupidMock(); // original mock
beanFactory.registerSingleton(StupidMock.class.getName(), stupidMock);

StupidMock f1 = applicationContext.getBean(StupidMock.class);
if (f1 == null || f1 != stupidMock) { // ensuring mock is retrievable
fail("Could not get bean");
}

for (String names2Remove : beanFactory.getBeanNamesForType(StupidMock.class)) {
applicationContext.removeBeanDefinition(names2Remove); // <-- fails here
}

StupidMock stupidMock2 = new StupidMock(); // replacement mock
beanFactory.registerSingleton(StupidMock.class.getName(), stupidMock2);
}
}

问题是这个简单的片段在尝试删除第一个 mock 时失败了,声称没有这样的 bean(尽管 Spring 刚刚成功地为我提供了一个名称)。

如果我只是尝试在第一个 mock 之上注册另一个 mock,Spring 会提示说已经存在对象绑定(bind)。

DefaultSingletonBeanRegistry 有一个 protected removeSingleton 方法,但我无法控制 StaticApplicationContext 拥有的 bean 工厂。无论如何我都可以使用反射并调用这个 protected 方法,但是对于这样一个简单的任务这样做感觉不对。

我做错了什么?如何在 StaticApplicationContext 上实现单例替换?

最佳答案

这里的问题是 registerSingleton 方法实际上并没有创建相应的 BeanDefinition。 ,它只是注册实例化的单例,将其与您提供的名称相关联,并稍后通过应用程序上下文检索它——尽管它没有底层的 BeanDefinition。

因此,当您调用 applicationContext.removeBeanDefinition(names2Remove); 时,它失败了,因为没有 bean definition , 只有注册的完全实例化的 bean。

解决方法是不使用 registerSingleton,而是使用一种使用 BeanDefinition 的 registerSingleton 形式:

Map<String, String> map = new HashMap<String, String>();
map.put("i", "10"); // set all the properties for the mock..
MutablePropertyValues propertyValues = new MutablePropertyValues(map);

beanFactory.registerSingleton(StupidMock.class.getName(), StupidMock.class, propertyValues);

关于java - 在 Spring 上重新注册单例 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11564926/

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