0

这是我正在测试的方法以及测试代码。我的测试方法取决于 runExecuteQueryStatement 生成的结果集。如果 resultSet 为 null 并且 resultSet.next 为 false,则当 resultSet.next 返回某些内容时,它将返回 0,否则将返回 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);
4

1 回答 1

0

参数匹配是个问题。依赖方法runExecuteQueryStatement有 2 个参数,其中一个是对象,另一个是字符串。可以模拟对象,其中字符串是硬编码的。但是在实现中,我为同一个方法传递了一个不同的字符串作为参数,所以存根不起作用。我们应该通过Matchers.anyString()进行参数匹配,而不是在存根中硬编码字符串值。当我们使用Matchers进行方法的参数匹配时。该方法的所有参数都应该是 Matchers。因此,存根适用于所有不同的参数值。

Mockito.when(pgManagerMock.runExecuteQueryStatement(Matchers.anyObject(), Matchers.anyString())).thenReturn(resultSetMock);
于 2018-03-03T18:03:39.260 回答