模拟结果集getTimeStamp不适用于更多的1行

时间:2017-03-23 06:52:15

标签: java junit mockito

我正在尝试在单元测试用例中模拟java.sql.resultset。我使用mocikto和junit进行断言。对mock和getString的所有调用都可以正常工作,但是当我尝试模拟getTimestamp时,它只适用于第一行,即第一个结果集。

when(statement.getResultSet()).thenReturn(resultSet);
    when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
    when(resultSet.getString("HIST_ID"))
   .thenReturn("").thenReturn("").thenReturn("").thenReturn("").thenReturn("");
when(resultSet.getTimestamp("CREATED_ON")).thenReturn(Timestamp.valueOf("2017-02-06 14:16:39.78"))
.thenReturn(Timestamp.valueOf("2017-02-08 11:29:31.3"))
.thenReturn(Timestamp.valueOf("2017-02-08 11:29:57.49"))
.thenReturn(Timestamp.valueOf("2017-02-08 11:30:13.47"))
.thenReturn(Timestamp.valueOf("2017-02-08 11:30:33.91"));

我尝试调试它,发现调用.thenReturn(Timestamp.valueOf(" 2017-02-08 11:29:31.3"))给出了这个例外: -

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Timestamp cannot be returned by toString()

此代码适用于一行,但下一行开始时会产生上述异常。

调用函数有这段代码 -

while (rs != null && rs.next()) {
        resp = new ClassA();
        resp.setCreatedDt(rs.getTimestamp("CREATED_ON"));
}

任何帮助都会非常感激。

由于 Tausif

1 个答案:

答案 0 :(得分:2)

我能够通过用这个

替换上面的代码来解决这个问题
thenReturn(Timestamp.valueOf("2017-02-06 14:16:39.78"),Timestamp.valueOf("2017-02-08 11:29:31.3"))

而不是链接方法。 完整代码: -

when(statement.getResultSet()).thenReturn(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
when(resultSet.getString("HIST_ID")).thenReturn("").thenReturn("").thenReturn("").thenReturn("").thenReturn("");
when(resultSet.getTimestamp("CREATED_ON")).thenReturn(Timestamp.valueOf("2017-02-06 14:16:39.78"),Timestamp.valueOf("2017-02-08 11:29:31.3"), Timestamp.valueOf("2017-02-08 11:29:57.49"), Timestamp.valueOf("2017-02-08 11:30:13.47"), Timestamp.valueOf("2017-02-08 11:30:33.91"));

虽然这解决了我的问题,但我仍然不确定如何解决这个问题。