Я пытаюсь проверить вызовы 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. Но возвращаются только выходные значения по умолчанию.
не исключение вы получили во время выполнения? Я думаю, вы должны использовать блок 'Catch' и пытаться распечатать' stackTrace', эта ситуация должна вызывать исключение. Thanxx –
Connection # prepareStatement не выбрасывает исключение. Значение всегда равно нулю. Следующий оператор ps.setString (1, empId); бросает NPE. Поэтому проблема заключается в том, что возвращается значение null. – Kartik
Почему вы используете 'Делегат', если он просто возвращает' ps'? Просто используйте его непосредственно как желаемый 'результат', как это сделано для' connection'. И обратите внимание, что такие методы, как 'with (...)', предназначены для * соответствия параметров *, а не для ожидаемых результатов. –