模拟JDBC的连接#prepareStatement始终使用jMockit

时间:2016-04-30 03:00:05

标签: java unit-testing jdbc testng jmockit

我正在尝试使用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。但只返回默认输出。

1 个答案:

答案 0 :(得分:1)

这不是一个错误。这是一个特色:)

您需要配置模拟。默认情况下,它们将返回null。

您需要添加&#39;期望&#39; -s,正如您在http://jmockit.org/tutorial/Mocking.html上看到的那样