JUnit用于数据库代码

时间:2008-09-06 14:57:31

标签: java database unit-testing junit

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

  1. 查询外部数据库,加载 进入饲料表
  2. 查询视图, 这是我的Feed和数据的增量 表,更新数据表以匹配 饲料表
  3. 我的单元测试策略是:

    我有一个可以随意操作的测试数据库。

      在setUP()中
    1. ,将一些数据加载到我的测试数据库
    2. 运行我的代码,使用我的测试数据库作为源
    3. 检查数据表,检查计数和某些记录的存在/不存在
    4. 清除测试数据库,加载不同的数据集
    5. 再次运行代码
    6. 再次检查数据表
    7. 显然,我将数据集加载到源数据库设置中,以便我知道应该添加,删除,更新等某些记录。

      这似乎有点麻烦,应该有一个更简单的方法?有什么建议吗?

5 个答案:

答案 0 :(得分:8)

您是否打算测试生成增量的视图,或者测试代码是否正确添加,删除和更新以响应视图?

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

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

我认为关键是将您的流程分解为多个部分并尽可能独立地测试每个部分。

答案 1 :(得分:6)

DbUnit将满足您的需求。需要注意的一点是,他们已经转而使用SLF4J作为他们的日志外观而不是JCL。您可以配置SLF4J以将日志记录转发到JCL,但是如果您在默认情况下在Nop日志提供程序中使用Maven DbUnit,则会收到警告,因此您最近必须使用排除{I} blogged来解决此问题。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

除了已建议的DBUnit之外,您可能需要查看Unitils。它使用DBUnit,但提供的不仅仅是(引用来自网站):

  
      
  • 自动维护数据库,支持增量,   可重复和后处理脚本
  •   
  • 自动禁用约束并将序列设置为最小值
  •   
  • 支持Oracle,Hsqldb,MySql,DB2,Postgresql,MsSql和Derby
  •   
  • 简化测试数据库连接设置
  •   
  • 使用DBUnit简单插入测试数据*在事务中运行测试
  •   
  • JPA实体管理器创建和注入hibernate,toplink和*   Hibernate SessionFactory创建和   会议
  •   
  • 自动测试JPA实体/ hibernate映射的映射   具有数据库的对象
  •