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

Mockito测试ResultSet返回值异常求助:预期返回1实际返回0

排查Mock ResultSet后测试返回0的问题

看起来你在Mock ResultSet时遇到了典型的测试坑,我帮你梳理几个最可能的原因和对应的排查步骤:

1. Mock的ResultSet未正确关联到runExecuteQueryStatement的返回值

这是最常见的问题:你可能单独Mock了ResultSet,但没有让runExecuteQueryStatement方法返回这个Mock实例,导致被测方法拿到的还是null或者默认的Mock对象。

排查验证:

在测试代码中,先断言runExecuteQueryStatement的返回值确实是你Mock的ResultSet:

// 假设你已经Mock了ResultSet实例
ResultSet mockRs = mock(ResultSet.class);
// 确保依赖方法返回这个Mock实例
when(yourDependency.runExecuteQueryStatement()).thenReturn(mockRs);

// 先验证返回值是否正确
assertEquals(mockRs, yourDependency.runExecuteQueryStatement());

2. next()方法的Mock设置错误

你可能不小心把next()的返回值设为了false,或者被测方法多次调用了next()但你的Mock只设置了一次返回true。

常见错误场景:

  • 误写为when(mockRs.next()).thenReturn(false)
  • 被测方法中调用了两次next()(比如先判断存在性,再获取数据),但你的Mock只设置了一次true,第二次默认返回false

修正方式:

如果被测方法只调用一次next():

when(mockRs.next()).thenReturn(true);

如果被测方法多次调用next(),需要指定多次返回值:

// 第一次返回true,后续返回false
when(mockRs.next()).thenReturn(true).thenReturn(false);

3. 被测方法的逻辑存在隐藏判断

仔细检查被测方法的代码,有没有以下情况:

  • 调用next()后又额外做了其他条件判断(比如检查某列是否为null),导致即使next()返回true也返回0
  • 异常捕获逻辑覆盖了返回1的分支(比如next()抛出SQLException后直接返回0,但你没Mock异常情况)

示例排查:

如果被测方法是这样的,就会因为第二次调用next()返回false而返回0:

public int yourMethod() {
    ResultSet rs = runExecuteQueryStatement();
    if (rs == null) return 0;
    rs.next(); // 第一次调用
    if (rs.next()) { // 第二次调用,Mock只设置了一次true的话这里会返回false
        return 1;
    }
    return 0;
}

4. Mock的范围或依赖类型错误

如果runExecuteQueryStatement是静态方法,普通的Mockito无法Mock,需要使用MockStatic(Mockito 3.4+)或PowerMock;如果是私有方法,也需要特殊处理。

静态方法Mock示例:

try (MockStatic<QueryUtils> mockStatic = mockStatic(QueryUtils.class)) {
    mockStatic.when(QueryUtils::runExecuteQueryStatement).thenReturn(mockRs);
    when(mockRs.next()).thenReturn(true);
    
    // 执行测试
    int result = yourService.yourMethod();
    assertEquals(1, result);
}

内容的提问来源于stack exchange,提问作者Muthaiah PL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:53:34