我正在尝试使用jMockit测试对Oracle DB的JDBC调用。我试图模拟JDBC的Connection#prepareStatement(String sql)
来返回PreparedStatement模拟对象,但我只得到一个空值。我的目标是模拟Connection API以返回模拟PreparedStatement对象,并模拟PreparedStatement API以返回模拟ResultSet对象。
我的源代码如下。
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插件运行单元测试。我在Eclipse中传递-javaagent:C:\downloads\jmockit.jar
作为VM参数。
更新:该方法接受jMockit提供的两个模拟参数。如果我没有通过java代理,TestNG会抛出一个错误,期望参数通过TestNG的dataProvider功能传递。 http://testng.org/doc/documentation-main.html#parameters-dataproviders
它确实返回一个模拟对象,但它会转向默认行为。例如,我想捕获传递给ps.setString(1, empId)
的值或模拟rs.next()
以返回true。但只返回默认输出。
答案 0 :(得分:1)
这不是一个错误。这是一个特色:)
您需要配置模拟。默认情况下,它们将返回null。
您需要添加&#39;期望&#39; -s,正如您在http://jmockit.org/tutorial/Mocking.html上看到的那样