使用Mockito mock带泛型通配符的缓存类时出现Unfinished stubbing错误
问题根因
该报错与泛型通配符、AsyncCache自定义实现均无关,核心原因是Mockito打桩语法使用错误。
Mockito中doReturn()链式打桩的语法规则为:when()方法仅接收被mock的目标对象,待打桩的方法调用需要写在when()括号外部。你当前的写法将asyncCaffeineCacheManager.getCache(anyString())直接传入了when(),这行代码会直接执行方法调用,Mockito无法捕获到待打桩的方法签名,因此抛出「未完成打桩」的错误。
修复代码
将打桩逻辑调整为正确语法即可:
@BeforeEach public void initTests() { doReturn(new NoOpAsyncCache<Integer, MyValue>("cacheName")) .when(asyncCaffeineCacheManager).getCache(anyString()); }
核心改动:将getCache(anyString())从when()的括号内移出,通过点运算符接在when(asyncCaffeineCacheManager)之后。
后续排查项
如果修正语法后仍存在报错,可按以下顺序校验:
- 确认
asyncCaffeineCacheManager是通过@Mock注解或Mockito.mock()生成的mock对象,而非手动new出来的真实业务实例 - 确认测试类已开启Mockito注解支持:JUnit5环境下可在类上添加
@ExtendWith(MockitoExtension.class),或在初始化方法中执行MockitoAnnotations.openMocks(this)完成mock对象注入 - 确认没有在当前打桩逻辑前,对同一个方法执行了未完成的打桩操作(比如漏写了thenReturn/thenThrow的残留代码)
内容的提问来源于stack exchange,提问作者Lior Derei
相关产品推荐
相关产品推荐

