You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mockito @Mock注解时仍报No qualifying bean类型不存在错误

问题原因
  • 普通@Mock是Mockito原生注解,仅会在测试类的属性层面生成模拟对象,不会将模拟对象注册到Spring的应用上下文中。你使用@SpringBootTest启动Spring容器时,Spring会自动扫描并创建DNBSupplierInfoProvider的Bean实例,此时到容器中查找依赖的HttpConnectionHelper时,找不到对应Bean就会抛出异常。
  • 你的代码本身存在逻辑错误:setUp方法第一行手动执行了restTemplate = new RestTemplate(),直接覆盖了@Mock生成的模拟RestTemplate实例,会导致后续所有针对RestTemplate的Mock规则完全失效。
  • 你已经在测试代码中手动new了DNBSupplierInfoProvider实例,并且将所有Mock的依赖传入构造函数,本身不需要Spring容器来创建这个Bean,当前报错是因为@SpringBootTest加载的TestConfig自动扫描到了DNBSupplierInfoProvider类,触发了自动Bean创建逻辑。
解决方案

你可以根据自己的测试需求二选一:

方案1:纯单元测试(无需启动Spring上下文,性能更快)

直接移除测试类上的三个Spring相关注解即可:

// 移除以下三个注解
// @RunWith(SpringRunner.class)
// @SpringBootTest(classes = TestConfig.class)
// @ActiveProfiles("test")

同时删除setUp方法中的restTemplate = new RestTemplate()行,保留MockitoAnnotations.openMocks(this)即可正常运行测试,所有Mock逻辑都会生效。

方案2:保留Spring上下文加载

如果你的测试确实需要依赖Spring容器的其他能力,将测试类中的@Mock注解替换为Spring Boot Test提供的@MockBean注解:

@MockBean
private RestTemplate restTemplate;

@MockBean
private HttpConnectionHelper httpConnectionHelper;

@MockBean
private ExternalSupplierInfoProviderProperties providerProperties;

@MockBean
private ExternalSupplierMessageMapper externalSupplierMessageMapper;

@MockBean
private ExternalSupplierInfoProviderProperties.ProviderProperties dnbProperties;

@MockBean会自动将生成的模拟对象注册到Spring应用上下文中,Spring创建DNBSupplierInfoProvider时就能找到对应的依赖Bean。同样需要删除setUp方法中手动赋值restTemplate的代码。

内容的提问来源于stack exchange,提问作者Winnie Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:54:09