使用Mockito Mock @Autowired Service时出现Wanted but not invoked错误如何解决
问题排查与修正
你的测试代码存在以下4处核心问题:
- 没有声明要测试的
AppController实例,也没有将Mock出来的DbCacheService实例注入到Controller中 - 测试方法中没有触发
AppController.refreshCache()的调用逻辑,直接执行Mockito校验,自然会提示dbCacheService.refreshCache()未被调用 - 存在冗余的初始化逻辑:你已经使用
@ExtendWith(MockitoExtension.class)开启了Mockito对JUnit5的支持,不需要再手动调用MockitoAnnotations.initMocks(this);同时@BeforeMethod是JUnit4/TestNG的注解,JUnit5对应的前置方法注解为@BeforeEach,该方法完全可以删除 - 测试类命名不匹配:当前测试类名为
SmsControllerTest,但实际测试的是AppController,建议修改命名避免后续维护混淆
修正后可正常运行的测试代码
@ExtendWith(MockitoExtension.class) class AppControllerTest { @Mock private DbCacheService dbCacheService; // @InjectMocks会自动将上面声明的Mock对象注入到AppController实例中 @InjectMocks private AppController appController; @Test void refreshCache() { // 先调用Controller的刷新缓存接口 String result = appController.refreshCache(); // 校验接口返回值符合预期 org.junit.jupiter.api.Assertions.assertEquals("DB Cache Refresh completed", result); // 再校验DbCacheService的refreshCache方法确实被调用了1次 org.mockito.Mockito.verify(dbCacheService, org.mockito.Mockito.times(1)).refreshCache(); } }
内容的提问来源于stack exchange,提问作者Jestino Sam
相关产品推荐
相关产品推荐

