2015-02-23 1 views
0

Я пытаюсь настроить тест с mockrunner в первый раз. Соединение установлено, но я получаю пустой набор результатов. Вот сгущенное рабочий пример:mockrunner jdbc - нет столбцов/строк в результирующем наборе

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); //[email protected] 
     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, который выполняется.

+0

Если я передаю заявление SQL в 'ExecuteQuery()' он работает, как ожидалось. Хотя для Подготовленного утверждения это не обязательно. Нормальные заявления также работают, как и ожидалось. – phobic

+0

Существуют методы, специфичные для объектов PreparedStatement: 'getJDBCMockObjectFactory(). GetMockConnection(). GetPreparedStatementResultSetHandler()' и 'getPreparedStatements()'. Но я все равно получаю пустой набор результатов, хотя я их использую. – phobic

ответ

1

Вам нужно использовать 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"); 
} 
+0

Как вы можете видеть выше, я уже ответил на этот вопрос и попробовал ваше решение, которое еще не сработало. Я связался с авторами mockrunner, и проблема была решена разработчиками несколько месяцев спустя: https://github.com/mockrunner/mockrunner/issues/11 Спасибо вам, я заметил обновление и поэтому буду принимать ваш ответ, так как он также показывает предпочтительное решение. – phobic

0

Исследуя 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); //[email protected] 
     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()); 
    } 
} 
Смежные вопросы