使用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
相关产品推荐
相关产品推荐

