JUnit用于数据库代码

时间:2020-03-05 18:48:43  来源:igfitidea点击:

我一直在尝试实现单元测试,目前有一些代码可以执行以下操作:

  • 查询外部数据库,加载到提要表中
  • 查询一个视图,这是我的供稿和数据表的增量,更新数据表以匹配供稿表

我的单元测试策略是这样的:

我有一个可以自由操作的测试数据库。

  • 在setUP()中,将一些数据加载到我的测试数据库中
  • 使用我的测试数据库作为源运行我的代码
  • 检查数据表,检查计数和某些记录是否存在
  • 清除测试数据库,加载不同的数据集
  • 再次运行代码
  • 再次检查数据表

显然,我具有加载到源数据库中的数据集,因此我知道应该添加,删除,更新某些记录等。

看来这有点麻烦,应该有更简单的方法吗?有什么建议?

解决方案

回答

DbUnit将满足需求。需要注意的一件事是,他们已改用SLF4J作为日志记录外观而不是JCL。我们可以将SLF4J配置为将日志转发到JCL,但是如果我们使用Maven DbUnit默认情况下会在其Nop日志提供程序中使用警告,则将收到警告,因此我们将不得不使用排除项,我最近在博客中谈到了这一冲突。

回答

我们是要测试生成增量的视图,还是要测试代码正确地添加,删除和更新以响应该视图?

如果要测试视图,则可以使用DBUnit之类的工具,用各种数据(我们已手动计算出增量)填充Feed和数据表。然后,对于每个测试,我们将验证视图是否返回匹配的集合。

如果要测试代码如何响应视图检测到的差异,我将尝试抽象化数据库访问。我想像一个Java方法,我们可以将结果集(或者POJO / DTO的列表)传递给该Java方法,并返回要添加的参数Object数组的列表(再次为POJO的列表)。其他方法将解析差异列表中要删除和更新的项目。然后,我们可以创建一个模拟结果集或者pojo,然后将它们传递给代码并验证是否返回了正确的参数。所有这些都无需接触数据库。

我认为关键是将过程分成多个部分,并尽可能独立地测试每个部分。

回答

我使用DbUnit,但是我也非常努力地不必针对数据库进行测试。
针对数据库的测试应仅出于测试数据库接口的目的而存在。
因此,我有Mock Db Connections,可以设置数据以用于所有其他测试。

回答

如果使用的是Maven,一种选择是使用sql-maven-plugin。它允许我们在Maven构建周期中运行数据库初始化/填充脚本。

回答

除了已经建议的DBUnit,我们可能还需要研究Unitils。它使用DBUnit,但提供了更多功能(从站点引用):

Automatic maintenance of databases, with support for incremental,
  repeatable and post processing scripts
  Automatically disable constraints and set sequences to a minimum value 
  Support for Oracle, Hsqldb, MySql, DB2, Postgresql, MsSql and Derby
  Simplify test database connection setup
  Simple insertion of test data with DBUnit  * Run tests in a transaction 
  JPA entity manager creation and injection for hibernate, toplink and *
  Hibernate SessionFactory creation and
  session 
  Automatically test the mapping of JPA entities / hibernate mapped
  objects with the database