Search code examples
javaunit-testingjdbcmockrunner

mockrunner jdbc - no columns/rows in result set


I try to set up a test with mockrunner for the first time. The connection is established, but I only get an empty result set. Here is the condensed working example:

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()); // []
    }
}

The expected output is a resultset with "1" and "foobar", as well as the SQL statement that is executed.


Solution

  • You need to use the PreparedStatementResultSetHandler.

    Here is a working modified version of your test:

    @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");
    }