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
相关产品推荐
相关产品推荐

