下面是我正在测试的方法和测试代码。我测试的方法依赖于runExecuteQueryStatement生成的结果集。如果ResultSet为空,resultSet.next为false,它将返回0,否则当resultSet.next返回某个值时,它将返回1。这就是我模拟resultSet的原因,ResultSet.next()。但我仍然得到0作为返回值。任何帮助都将不胜感激。谢谢
测试中的方法
int result = 0;
try {
ResultSet resultSet = runExecuteQueryStatement(dbServerConn, "SELECT 1 AS cnt FROM pg_database WHERE datname ='" + dbName + "';");
while (resultSet.next()) {
result = resultSet.getInt("cnt");
}
}catch(Exception ex) {
logger.error(ex.getMessage());
}
return result;依赖方法代码(runExecuteQueryStatement)
ResultSet resultSet = null;
Connection conn = getConnection(dbServerConn);
Statement stmt = conn.createStatement();
resultSet = stmt.executeQuery(sqlStatement);
return resultSet;测试代码
PostgresDatabaseManager pgManagerMock = Mockito.mock(PostgresDatabaseManager.class);
DbConnection dbConnectionMock = Mockito.mock(DbConnection.class);
String sqlStatementMock = SOME_STRING;
ResultSet resultSetMock = Mockito.mock(ResultSet.class);
Mockito.when(resultSetMock.next()).thenReturn(TRUE).thenReturn(FALSE);
Mockito.when(resultSetMock.getInt("cnt")).thenReturn(1);
Mockito.when(pgManagerMock.runExecuteQueryStatement(dbConnectionMock, sqlStatementMock)).thenReturn(resultSetMock);
Mockito.when(pgManagerMock.runExecuteQueryStatementWrapperForCheckDBExists(dbConnectionMock, sqlStatementMock)).thenCallRealMethod();
int actualResult = pgManagerMock.runExecuteQueryStatementWrapperForCheckDBExists(dbConnectionMock, sqlStatementMock);
int expectedResult = 1;
Assert.assertEquals(expectedResult, actualResult);发布于 2018-03-04 02:03:39
参数匹配是问题所在。依赖方法runExecuteQueryStatement有两个参数,其中一个是对象,另一个是字符串。对象可以被模拟,其中字符串是硬编码的。但在实现中,我为同一个方法传递了一个不同的字符串作为参数,因此存根不起作用。我们应该按Matchers.anyString().进行参数匹配,而不是在存根中对字符串值进行硬编码当我们使用匹配器进行方法的参数匹配时。该方法上的所有参数都应该是Matcher。因此,存根适用于所有不同的参数值。
Mockito.when(pgManagerMock.runExecuteQueryStatement(Matchers.anyObject(), Matchers.anyString())).thenReturn(resultSetMock);https://stackoverflow.com/questions/49058933
复制相似问题