Mockito - 模拟ResultSet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mockito - 模拟ResultSet相关的知识,希望对你有一定的参考价值。

这是我的测试方法以及测试代码。我测试的方法取决于runExecuteQueryStatement生成的结果集。如果resultSet为null且resultSet.next为false,则当resultSet.next返回某个内容时,它将返回0 else,然后它将返回1.这就是我模拟ResultSet,ResultSet.next()的原因。但我仍然得到0作为回报值。任何帮助都感激不尽。谢谢

Method Under Test

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;

Dependent Method Code (runExecuteQueryStatement)

ResultSet resultSet = null;
    Connection conn = getConnection(dbServerConn);
    Statement stmt = conn.createStatement();
    resultSet = stmt.executeQuery(sqlStatement);

    return resultSet;

Test Code

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);
答案

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

Mockito.when(pgManagerMock.runExecuteQueryStatement(Matchers.anyObject(), Matchers.anyString())).thenReturn(resultSetMock);

以上是关于Mockito - 模拟ResultSet的主要内容,如果未能解决你的问题,请参考以下文章

Mockito 简明教程

Mockito 简明教程

Mockito

使用Mockito模拟Apache HTTPClient

使用 Mockito 时,模拟和间谍有啥区别?

Mockito 用 Spring 模拟:“传递给 verify() 的参数不是模拟!”