【问题标题】:mockrunner jdbc - no columns/rows in result setmockrunner jdbc - 结果集中没有列/行
【发布时间】:2015-04-24 21:57:15
【问题描述】:

我第一次尝试使用 mockrunner 设置测试。连接已建立,但我只得到一个空的结果集。这是精简的工作示例:

import com.mockrunner.jdbc.BasicJDBCTestCaseAdapter;
import com.mockrunner.jdbc.StatementResultSetHandler;
import com.mockrunner.mock.jdbc.MockResultSet;

public class ExtractDataTest extends BasicJDBCTestCaseAdapter {
    @Test
    public void test() throws Exception {
        StatementResultSetHandler statementHandler = getJDBCMockObjectFactory()
                .getMockConnection().getStatementResultSetHandler();
        MockResultSet resultMock = statementHandler.createResultSet();
        resultMock.addColumn("ID", new Object[]{"1"});
        resultMock.addColumn("USERNAME", new Object[]{"foobar"});
        statementHandler.prepareGlobalResultSet(resultMock);

        Connection con = DriverManager.getConnection( "a", "b", "c");
        System.out.println(con); //com.mockrunner.mock.jdbc.MockConnection@29d8a2c5
        PreparedStatement stmtObjects = con.prepareStatement(
                  "SELECT * FROM USER");
        ResultSet rs = stmtObjects.executeQuery();
        System.out.println(rs); // empty result set
        System.out.println(this.getExecutedSQLStatements()); // []
    }
}

预期的输出是带有“1”和“foobar”的结果集,以及执行的 SQL 语句。

【问题讨论】:

  • 如果我将 sql 语句传递给executeQuery(),它会按预期工作。但是,对于 PreparedStatement,这不是必需的。普通语句也可以按预期工作。
  • 有特定于 PreparedStatement 对象的方法:getJDBCMockObjectFactory().getMockConnection().getPreparedStatementResultSetHandler()getPreparedStatements()。但我仍然得到一个空的结果集,即使我使用它们。

标签: java unit-testing jdbc mockrunner


【解决方案1】:

通过探索 API,我发现了专门用于 PreparedStatements 实例的方法,但我并不知道:

getJDBCMockObjectFactory().getMockConnection().getPreparedStatementResultSetHan‌​dler()getPreparedStatements()。即使我无法检索模拟结果集。 statementHandler.prepareGlobalResultSet(resultMock); 似乎没有添加模拟结果集。这可能是 mockrunner 中的一个错误,所以我会联系作者。一种解决方法是使用statementHandler.prepareResultSet("SELECT * FROM", resultMock, new HashMap());。这是一个完整的工作示例,以防您遇到相同的错误:

import java.sql.*;
import java.util.HashMap;
import org.junit.Test;
import com.mockrunner.jdbc.BasicJDBCTestCaseAdapter;
import com.mockrunner.jdbc.PreparedStatementResultSetHandler;
import com.mockrunner.mock.jdbc.MockResultSet;
public class ExtractDataTest extends BasicJDBCTestCaseAdapter {
    @Test
    public void test() throws Exception {
        PreparedStatementResultSetHandler statementHandler = getJDBCMockObjectFactory()
                .getMockConnection().getPreparedStatementResultSetHandler();
        MockResultSet resultMock = statementHandler.createResultSet();
        resultMock.addColumn("ID", new Object[]{"1"});
        resultMock.addColumn("USERNAME", new Object[]{"foobar"});
        statementHandler.prepareResultSet("SELECT * FROM DUAL", resultMock, new HashMap());
        Connection con = DriverManager.getConnection( "a", "b", "c");
        System.out.println(con); //com.mockrunner.mock.jdbc.MockConnection@29d8a2c5
        PreparedStatement stmtObjects = con.prepareStatement(
                  "SELECT * FROM DUAL WHERE 1=?"); //SELECT * FROM DUAL would work, too.
        ResultSet rs = stmtObjects.executeQuery();
        System.out.println(rs);
        System.out.println(this.getPreparedStatements());
    }
}

【讨论】:

    【解决方案2】:

    您需要使用 PreparedStatementResultSetHandler。

    这是您的测试的有效修改版本:

    @Test
    public void test() throws Exception {
        PreparedStatementResultSetHandler statementHandler = getJDBCMockObjectFactory()
                .getMockConnection().getPreparedStatementResultSetHandler();
        MockResultSet resultMock = statementHandler.createResultSet();
        resultMock.addColumn("ID", new Object[]{"1"});
        resultMock.addColumn("USERNAME", new Object[]{"foobar"});
        statementHandler.prepareGlobalResultSet(resultMock);
    
        Connection con = DriverManager.getConnection( "a", "b", "c");
        PreparedStatement stmtObjects = con.prepareStatement(
                "SELECT * FROM USER");
        ResultSet rs = stmtObjects.executeQuery();
        assertTrue(rs.next());
        //System.out.println(rs); 
        //System.out.println(getExecutedSQLStatements()); 
        verifySQLStatementExecuted("SELECT * FROM USER");
    }
    

    【讨论】:

    • 正如您在上面看到的,我已经回答了这个问题,并尝试了您的解决方案,但尚未奏效。我联系了 mockrunner 的作者,几个月后开发人员解决了这个问题:github.com/mockrunner/mockrunner/issues/11 谢谢你,我注意到了更新,因此会接受你的回答,因为它也显示了首选的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2020-07-23
    • 2011-01-31
    • 2014-08-24
    相关资源
    最近更新 更多