Java中测试服务/DAO层的工具和方法

Java中测试服务/DAO层的工具和方法,java,testing,automated-tests,integration-testing,Java,Testing,Automated Tests,Integration Testing,我试图找出测试服务层和DAO层的最佳方法。所以,有几个小问题 测试服务层时,最好是针对模拟DAO层进行测试,还是针对测试环境的“活动”DAO层进行测试 当唯一的测试数据库位于共享环境(Oracle/DB2)中时,应该如何测试DAO层中的SQL 如何解决任何DAO写入/更新都需要用DAO读取进行测试这一悖论,而DAO读取也需要进行测试 我正在寻找这方面的任何好的文档、文章或参考资料,以及帮助实现流程自动化的任何工具。我已经知道JUint用于单元测试,Hudson用于CI。以下是我的答案: 使用模拟

我试图找出测试服务层和DAO层的最佳方法。所以,有几个小问题

  • 测试服务层时,最好是针对模拟DAO层进行测试,还是针对测试环境的“活动”DAO层进行测试
  • 当唯一的测试数据库位于共享环境(Oracle/DB2)中时,应该如何测试DAO层中的SQL
  • 如何解决任何DAO写入/更新都需要用DAO读取进行测试这一悖论,而DAO读取也需要进行测试
  • 我正在寻找这方面的任何好的文档、文章或参考资料,以及帮助实现流程自动化的任何工具。我已经知道JUint用于单元测试,Hudson用于CI。

    以下是我的答案:

  • 使用模拟DAO测试您的服务。容易得多,快得多。使用EasyMock或Mockito或任何其他模拟框架来测试服务层
  • 为每个开发人员提供自己的数据库模式以执行其测试。这样的模式通常是空的:单元测试在运行测试之前用一个小的测试数据集填充数据库,并在测试完成后清空它。用于此
  • 如果读操作针对定义良好的静态测试数据集(您应该对其进行单元测试),那么您可以依靠读操作对写操作进行单元测试。但您也可以使用特殊查询,甚至使用DBUnit来测试写操作是否按预期工作。测试不一定按此顺序运行这一事实并不重要。如果一切顺利,那么一切都好
  • 得到。它有一些关于如何测试数据库访问的好技巧

    就我个人而言,我通常将DAO测试分为两部分:一部分是使用模拟数据库进行的单元测试,用于测试DAO上的功能;另一部分是集成测试,用于测试针对DB的查询。如果DAO只有数据库访问代码,则不需要进行单元测试

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

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

    检查dbmigrate,它不是用于测试的,但它将帮助您管理脚本以升级和降级您的DB模式


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

    +1用于工具和建议。您是否反驳Augusto关于DBUnit的评论?DBUnit有其独特之处,但如果您坚持每个单元测试类使用一个数据集(而不是所有测试都使用一个大数据集),它是可以管理的。我必须说,我没有在同一个联盟中尝试过任何其他工具,但DBUnit在一个相当大的项目中对我有效。也许我的陈述有点苛刻,但我发现DBUnit的问题是重构非常困难。我在项目中与4位非常优秀的开发人员一起工作,我们经常更改模式。不幸的是,eclipse不擅长进行这些重构,因此我们必须手动更新DBunit文件(每个测试类有一个数据集)。我认为intellij在这方面可能更好,但我不确定。