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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:15:01