2016-04-30 8 views
1

Я пытаюсь проверить вызовы JDBC на Oracle DB с помощью jMockit. Я попытался имитировать JQBC Connection#prepareStatement(String sql), чтобы вернуть объект-подделку PreparedStatement, но вместо этого я получаю только нулевое значение. Моя цель состоит в том, чтобы издеваться над API-интерфейсом соединения, чтобы вернуть объект-подделку PreparedStatement и издеваться над API-интерфейсом PreparedStatement, чтобы вернуть объект-макет ResultSet.Mocking Подключение JDBC# prepareStatement всегда возвращает null с помощью jMockit

Мой исходный код приведен ниже.

try (Connection conn = DriverManager.getConnection(url, username, password);) { 
    try(PreparedStatement ps = conn.prepareStatement(
     "SELECT firstName, lastName from Employee where empId = ?");) { 
    ps.setString(1, empId); // This is an input to function. 
    try(ResultSet rs = ps.executeQuery();) { 
     while(rs.next()) { 
     Employee emp = new Employee(); 
     emp.setFirstName(rs.getString("firstName")); 
     emp.setLastName(rs.getString("lastName")); 
     return emp; 
     } 
    } 
    } 
} 
return employees; 

Когда я призываю

PreparedStatement ps = conn.prepareStatement(
      "SELECT firstName, lastName from Employee where empId = ?") 

Мой блок тест следующим

@Test() 
    public void testQueryOutOfDateSpanishContent_Success(
     @Mocked final Connection connection, @Mocked final PreparedStatement ps) throws Exception { 
    new Expectations(DriverManager.class) { 
     { 
     DriverManager.getConnection(
      dcrParameters.getEnvironmentUrl(), dcrParameters.getUsername(), 
      dcrParameters.getPassword()); 
     result = connection; 

     connection.prepareStatement(anyString); 
     result = with(new Delegate<PreparedStatement>() { 
      public PreparedStatement prepareStatement(String sql) throws SQLException { 
      return ps; 
      } 
     }); 
     } 
    }; 
    // Call the source function here. 

Я использую TestNG 6.10 с последней версией выпуска JMockit. Я запускаю единичный тест с помощью плагина TestNG eclipse. Я прохожу -javaagent:C:\downloads\jmockit.jar в качестве аргумента VM в Eclipse.

Обновление: метод принимает два смешных аргумента, предоставленных jMockit. Если я не передаю java-агент, TestNG выдает ошибку, ожидающую, что аргументы будут переданы через функцию DataProvider TestNG. http://testng.org/doc/documentation-main.html#parameters-dataproviders

Он возвращает объект-макет, но прибегает к поведению по умолчанию. Например, я хочу зафиксировать, какое значение передается в ps.setString(1, empId), или для имитации rs.next(), чтобы вернуть true. Но возвращаются только выходные значения по умолчанию.

+0

не исключение вы получили во время выполнения? Я думаю, вы должны использовать блок 'Catch' и пытаться распечатать' stackTrace', эта ситуация должна вызывать исключение. Thanxx –

+0

Connection # prepareStatement не выбрасывает исключение. Значение всегда равно нулю. Следующий оператор ps.setString (1, empId); бросает NPE. Поэтому проблема заключается в том, что возвращается значение null. – Kartik

+0

Почему вы используете 'Делегат', если он просто возвращает' ps'? Просто используйте его непосредственно как желаемый 'результат', как это сделано для' connection'. И обратите внимание, что такие методы, как 'with (...)', предназначены для * соответствия параметров *, а не для ожидаемых результатов. –

ответ

1

Это не ошибка. Это особенность :)

Вам нужно настроить макет. По умолчанию они возвращают значение null.

Вам нужно добавить «Expectation'-с, как вы можете видеть на http://jmockit.org/tutorial/Mocking.html

+0

Я сделал это. Маки создаются, но они не передаются, если я не настроил два отдельных блока ожидания. – Kartik