用于在Java中测试Service / DAO层的工具和方法

时间:2011-03-01 15:43:33

标签: java testing automated-tests integration-testing

我试图找出测试服务和DAO层的最佳方法。所以,一些子问题......

  1. 在测试服务层时,最好是针对模拟DAO层或指向测试环境的“实时”DAO层进行测试吗?
  2. 当唯一的测试数据库位于共享环境(Oracle / DB2)中时,如何测试DAO层中的SQL
  3. 你如何解决任何DAO写/更新的悖论需要用DAO读取进行测试哪些也必须进行测试?
  4. 我正在寻找此领域的任何优秀文档,文章或参考资料以及任何有助于自动化流程的工具。我已经了解了JUint的单元测试和Hudson的CI。

2 个答案:

答案 0 :(得分:4)

获取Growing Object-Oriented Software, Guided by Tests。它有一些关于如何测试数据库访问的好技巧。

就个人而言,我通常打破2中的DAO测试,使用模拟数据库进行单元测试以测试DAO上的功能,以及集成测试,以测试针对数据库的查询。如果您的DAO只有数据库访问代码,则不需要进行单元测试。

我所采用的书中的一个建议是(集成)测试必须将更改提交给DB。我已经学会了这样做,在使用hibernate并确定测试标记为回滚并且DB从未得到插入语句之后。如果您使用触发器或任何类型的验证(甚至是FK),我认为这是必须的。

另一件事,远离dbunit,开始工作是一个很好的框架,但当项目变得非常微小时,它变得很糟糕。我的偏好是,有一组Test Data Builder类来创建数据,并将其插入测试设置或测试本身。

并检查dbmigrate,它不是用于测试,但它将帮助您管理脚本以升级和降级数据库架构。

在共享数据库服务器的场景中,我为每个环境创建了一个架构/用户。由于每个开发人员都有自己的“本地”环境,因此他也拥有一个模式。

答案 1 :(得分:3)

以下是我的答案:

  1. 使用模拟DAO测试您的服务。更容易,更快。使用EasyMock或Mockito或任何其他模拟框架来测试服务层。
  2. 为每个开发人员提供自己的数据库模式以执行他的测试。这样的模式通常是空的:单元测试在运行测试之前使用小的测试数据集填充数据库,并在测试完成后清空它。请使用DBUnit
  3. 如果读取对定义明确的静态测试数据集(您应该进行单元测试)起作用,那么您可以依赖它们对写入进行单元测试。但您也可以使用即席查询甚至DBUnit来测试写入是否按预期工作。测试不一定按此顺序运行的事实并不重要。如果一切顺利,那么一切都会好的。