我这样嘲笑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
请帮忙!
答案 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