如何使用Mockito模拟ResultSet.next()方法

时间:2015-08-19 06:32:50

标签: java unit-testing mockito

我这样嘲笑java.sql.ResultSet

ResultSet rs = mock(ResultSet.class);
when(rs.next()).thenReturn(true); // this seems wrong appraoch

测试代码就像这样

while (rs.next()) {
  // doing stuff here
}

问题是当我将rs.next()模拟到true然后while循环永远不会终止。我希望在2次迭代后终止while循环。那么我怎么能模仿rs.next()方法?

我也试过

when(rs.next()).thenReturn(true, true, false); // always return false 

请帮忙!

4 个答案:

答案 0 :(得分:10)

您可以链接doReturn()方法调用:

doReturn(true).doReturn(true).doReturn(false).when(rs).next();

或者,如评论中所述,链thenReturn方法调用:

when(rs.next()).thenReturn(true).thenReturn(true).thenReturn(false);

或者,如果你想更进一步,你可以使用Mockito Answer

when(rs.next()).thenAnswer(new Answer() {
    private int iterations = 2;

    Object answer(InvocationOnMock invocation) {
        return iterations-- > 0;
    }
});

答案 1 :(得分:3)

尝试

when(rs.next()).thenReturn(true).thenReturn(true).thenReturn(false);

答案 2 :(得分:0)

虽然其他答案在技术上是正确的(如果在您的代码中不起作用,那么可能还有其他内容在运行,需要更多代码)。他们都错过了一个重要的观点:

您不应该模拟JDBC类,而是创建一个后面有真实数据库的集成测试。还要注意ResultSet确实是一个接口,但驱动程序/ DB可能在行为上有一些差异。这种模仿这种测试的测试使开发人员对实际生产行为视而不见。

如果此代码只是处理返回的数据而不是实际的JDBC调用代码,则此代码应该与JDBC类分离,因为ResultSet不应导入。从长远来看,它有助于从业务代码中分离技术代码。

答案 3 :(得分:0)

when(rs.next()).thenReturn(true, true, false);

这应该有效。

我找到了一个来自&mock;模拟核心的javadoc的例子:1.10.19'。

看看这个: org.mockito.Mockito.when