Mockito和jdbc程序调用

时间:2013-05-31 08:01:41

标签: jdbc junit mockito

我正在尝试使用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 个答案:

答案 0 :(得分:5)

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

基本上,我们现在谈的是集成测试,而不是单元测试。而且我看不出Mockito会对你有很多帮助,虽然JUnit肯定会这样做。

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

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

  1. 创建一个虚拟表来记录过程调用,
  2. 创建一个虚拟的DEL_DATA过程,除了记录虚拟表中调用的参数外什么都不做
  3. 运行方法
  4. 从虚拟表中选择,以验证是否正确调用了该过程。
  5. 使用H2,您可以在“内存”模式下运行此类测试,这意味着在每次测试结束时无需任何清理步骤。

答案 1 :(得分:4)

为此代码编写单元测试没有意义。一旦你模拟了DB访问部分,就没有任何逻辑可供你进行单元测试。

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

答案 2 :(得分:0)

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

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

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

以可测试的方式(作为一个单元)重写持久性,或者在集成测试而不是单元测试中测试它。

答案 3 :(得分:0)

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

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