如何用Mockito实现nameManager.getName()仅在第二次调用时返回有效值
实现方案
方法1:使用Mockito连续存根(最简实现)
Mockito原生支持按调用顺序配置同一方法的不同返回结果,无需自行统计调用次数,完全匹配你的需求:
// 替换为你实际测试使用的入参名称 String targetName = "test_input_name"; // 按调用顺序配置返回值 when(nameManager.getName(targetName)) .thenReturn(Optional.empty()) // 第一次调用返回空,匹配第一次校验逻辑 .thenReturn(Optional.of(targetName)); // 第二次调用返回对应名称,匹配保存后的校验逻辑
如果后续还有更多次调用,可继续链式追加thenReturn,最后一次配置的返回值会作为后续所有调用的默认返回值。
方法2:使用doAnswer自定义计数(适合复杂逻辑场景)
如果你需要自行控制计数逻辑(比如后续有更复杂的判断条件),可以用AtomicInteger实现调用次数统计,解决lambda内部只能引用final变量的语法限制:
String targetName = "test_input_name"; AtomicInteger callCounter = new AtomicInteger(0); doAnswer(invocation -> { int currentTimes = callCounter.incrementAndGet(); // 仅第二次调用返回对应名称 if (currentTimes == 2) { return Optional.of(targetName); } // 其余调用均返回空 return Optional.empty(); }).when(nameManager).getName(targetName);
- 如果需要匹配任意入参的
getName调用,可以将入参替换为anyString() - 单测场景下无需担心
AtomicInteger的性能开销,仅作为计数容器使用即可
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

