SpringBootTest使用@MockBean报错:存在多个同类型bean无法注册mock bean
问题触发原因
- 你的
CodeGenerateDbConfig类加了@Configuration注解,Spring会自动将该配置类本身注册为Bean,默认Bean名称为类名首字母小写的codeGenerateDbConfig - 同时该配置类内部又定义了一个返回值为
CodeGenerateDbConfig类型的@Bean方法,方法名initCodeGenerateDbConfig会作为第二个同类型Bean的名称注册到上下文 - 单元测试中使用
@MockBean默认按类型匹配要替换的Bean,此时上下文存在两个同类型的Bean,Spring无法确定要替换哪一个,因此抛出异常。
解决方案
方案1:指定MockBean的替换名称(最快修复)
给@MockBean添加name属性,明确指定要替换的Bean名称即可:
@MockBean(name = "initCodeGenerateDbConfig") private CodeGenerateDbConfig initCodeGenerateDbConfig;
方案2:优化配置类初始化逻辑(推荐,解决设计问题)
你当前的@Bean方法只是用来执行数据源初始化逻辑,不需要返回配置类实例,完全可以用@PostConstruct替代@Bean,避免额外注册同类型Bean:
@Configuration public class CodeGenerateDbConfig { @PostConstruct public void initCodeGenerateDbConfig() { if(StringUtils.isNotBlank(url)){ CodegenDatasourceConfig.initDbConfig(driverClassName,url, username, password); } } }
修改后上下文只会存在codeGenerateDbConfig一个该类型的Bean,原测试代码的@MockBean无需额外配置即可正常运行。
内容的提问来源于stack exchange,提问作者unixing
相关产品推荐
相关产品推荐

