Reputation: 1013
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.
Upvotes: 0
Views: 1781
Reputation: 5366
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");
}
Upvotes: 2
Reputation: 1013
By exploring the API, I came across methods that are specifically meant to be used with PreparedStatements instances that I was not aware about:
getJDBCMockObjectFactory().getMockConnection().getPreparedStatementResultSetHandler()
and getPreparedStatements()
. Even though I was not able to retrieve the mocked result set.
statementHandler.prepareGlobalResultSet(resultMock);
does not seem to add the mocked result set. This might be a bug in mockrunner, so I will contact the author(s) about it. A workaround is to use statementHandler.prepareResultSet("SELECT * FROM", resultMock, new HashMap());
. Here is a complete working example, in case you experience the same error:
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());
}
}
Upvotes: 0