我正在尝试使用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测试这样的方法?
提前致谢。
答案 0 :(得分:5)
这样的方法实际上不是单元测试的候选者,因为它的全部目的是与数据库进行交互。也许你想测试你正确地与数据库交互。这将是一个有效的测试,但要做到这一点,需要涉及一个数据库。
基本上,我们现在谈的是集成测试,而不是单元测试。而且我看不出Mockito会对你有很多帮助,虽然JUnit肯定会这样做。
过去,我测试这样的代码的方式是使用轻量级的内存数据库。其中有一些,但我推荐的是H2(h2database.com)。一旦你的路径中有H2罐,这个速度相当快且易于使用。
您可能希望集成测试执行以下操作。
使用H2,您可以在“内存”模式下运行此类测试,这意味着在每次测试结束时无需任何清理步骤。
答案 1 :(得分:4)
为此代码编写单元测试没有意义。一旦你模拟了DB访问部分,就没有任何逻辑可供你进行单元测试。
您需要模拟业务逻辑而不是持久性代码。
答案 2 :(得分:0)
简短的回答是“你不能,这不是它的目的。”
除此之外,您的“deleteData”方法无法直接测试且签名无效。
为了测试您的功能是否有效,您必须首先调用deleteData方法,然后尝试加载已删除的数据(假设您的DataStore是ACID),并声明加载的数据不存在。这不是单元测试(因为它不是孤立的)。
以可测试的方式(作为一个单元)重写持久性,或者在集成测试而不是单元测试中测试它。
答案 3 :(得分:0)
你不应该模拟JDBC调用 - 它可以完成,但它太复杂了,并没有太大的价值。相反,你会模拟deleteData方法来测试调用它的其他方法。
要测试deleteData方法本身,您需要编写一个连接到真实数据库或嵌入式数据库的集成测试。