1

我正在尝试使用 mockito 为一些 jdbc 过程调用编写单元测试。这是我第一次用模拟对象(mockito)编写测试。

我试图测试的方法看起来像这样......

 public void deleteData(final Connection connection, final AnObject ) {
     CallableStatement statement = null;

     statement = connection.prepareCall("{call DEL_DATA(?)}");
     statement.setInt(1, object.getId());

     statement.executeUpdate();

     connection.commit();

     DatabaseSql.close(statement);
}

如何使用 mockito 和 junit 测试这样的方法?

提前致谢。

4

4 回答 4

6

像这样的方法并不是单元测试的真正候选者,因为它的全部目的是与数据库交互。也许您想测试您是否正确地与数据库交互。这将是一个有效的测试,但要做到这一点,需要涉及一个数据库。

基本上,我们现在谈论的是集成测试,而不是单元测试。我看不出 Mockito 会对你有多大帮助,尽管 JUnit 肯定会。

过去,我测试这样的代码的方式是使用轻量级内存数据库。其中有一些,但我推荐的是 H2 (h2database.com)。一旦你的路径中有 H2 jar,这相当快速且易于使用。

您可能希望您的集成测试执行以下操作。

  1. 创建一个虚拟表来记录过程调用,
  2. 创建一个虚拟 DEL_DATA 过程,它只在虚拟表中记录调用它的参数
  3. 运行方法
  4. 从虚拟表中选择,以验证是否正确调用了该过程。

使用 H2,您可以在“内存中”模式下运行此类测试,这意味着在每个测试结束时不需要任何清理步骤。

于 2013-05-31T08:52:59.580 回答
4

没有必要为此代码编写单元测试。一旦您模拟了数据库访问部分,就没有逻辑可供您进行单元测试。

您需要模拟您的业务逻辑而不是您的持久性代码。

于 2013-05-31T08:05:01.390 回答
0

那么简短的回答是“你不能,这不是它的设计目的”。

除此之外,您的“deleteData”方法不可直接测试并且具有无效签名。

为了测试您的功能是否有效,您必须首先调用您的 deleteData 方法,然后尝试加载已删除的数据(假设您的 DataStore 是 ACID),并断言加载的数据不存在。这不是单元测试(因为它不是孤立的)。

要么以可测试的方式(作为一个单元)重写你的持久性,要么在集成测试而不是单元测试中对其进行测试。

于 2013-05-31T08:12:08.090 回答
0

您不应该模拟 JDBC 调用 - 它可以完成,但它太复杂并且没有太大的价值。相反,您将模拟 deleteData 方法来测试调用它的其他方法。

要测试 deleteData 方法本身,您需要编写一个连接到真实数据库或嵌入式数据库的集成测试。

于 2013-05-31T08:16:20.143 回答