SpringbootTest MockBean 错误有啥问题

Posted

技术标签:

【中文标题】SpringbootTest MockBean 错误有啥问题【英文标题】:something wrong with SpringbootTest MockBean errorSpringbootTest MockBean 错误有什么问题 【发布时间】:2022-01-04 06:49:43 【问题描述】:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class)
public class SampleTest 
    
    @MockBean
    private CodeGenerateDbConfig initCodeGenerateDbConfig;


@Configuration
public class CodeGenerateDbConfig 
    
    @Bean
    public CodeGenerateDbConfig initCodeGenerateDbConfig() 
        if(StringUtils.isNotBlank(url))
            CodegenDatasourceConfig.initDbConfig(driverClassName,url, username, password);
        
        return null;
    

错误是:

Caused by: java.lang.IllegalStateException: Unable to register mock bean org.jeecg.config.init.CodeGenerateDbConfig expected a single matching bean to replace but found [codeGenerateDbConfig, initCodeGenerateDbConfig]

【问题讨论】:

这不是错误,是缺少一些配置。您的模拟不知道您要模拟哪种类型的 bean。自从我使用这种类型的嘲笑以来已经有一段时间了,但我猜使用 Qualifier 将能够在这里提供帮助 错误正确地描述了问题。根据您的配置,您的测试类无法找到唯一的 bean,因为 initCodeGenerateDbConfigCodeGenerateDbConfig 都是相同的 bean。我认为使用@Qualifier 可以解决问题。 你的@Configuration 是一个CodeGenerateDbConfig 然后你滥用/滥用@Bean 方法来做一些初始化,它也返回一个CodeGenerateDbConfig。放弃 @Bean 方法并将代码放入 @PostConstruct 方法中。 【参考方案1】:

MockBean好像不支持,所以必须手动指定

手动指定类型注入正常启动。

@MockBean(classes = CodeGenerateDbConfig .class)

您要手动指定要注入的类型吗?

【讨论】:

以上是关于SpringbootTest MockBean 错误有啥问题的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot @WebMvcTest 和 @MockBean 没有按预期工作

为啥弹簧测试失败,不起作用@MockBean

使用Spring Boot的@MockBean时创建严格的模拟?

[@ MockBean和@Autowired在一个测试类中使用同一服务

SpringBoot @MockBean 和 @WebMvcTest 不起作用

在应用程序启动之前配置@MockBean 组件