DAO单元测试

时间:2012-03-21 15:13:15

标签: unit-testing dao easymock dbunit

我一直在关注使用它进行单元测试DAO类的EasyMock和教程/示例,用于“外部容器”测试。但是,我认为他们中的大多数都在谈论测试服务层,而不是模拟DAO类。我有点困惑,你真的是如何对DAO层进行单元测试吗?

有人会说测试与DB& amp; EJB实际上是集成测试而不是单元测试但是你怎么知道你的SQL是否正确(假设没有ORM)并且你的DAO插入/查询真实的正确数据(读取,本地数据库与生产中的类似)数据库?

我读到DBUnit是这种情况的解决方案。但我的问题是使用像DBUnit这样的框架“外部容器”。如果DAO依赖于某些EJB,我们如何处理事务,如果有更新其他表的触发器会发生什么?

仅对具有此类依赖性的DAO进行单元测试的最佳方法是什么?

5 个答案:

答案 0 :(得分:28)

就个人而言,我通过点击某种测试数据库对单元测试DAO进行单元测试,最好是应用程序在生产中使用的相同类型的数据库(显然不是SAME数据库)。

我认为如果你这样做,测试更多的是集成测试,因为它依赖于正在运行的数据库。这种方法的好处在于它尽可能接近您正在运行的生产环境。它有缺点,您需要测试配置,您需要一个运行测试数据库(您的机器本地或您的环境中的某个地方),测试可能需要更长的时间来运行。您还需要确保在执行测试后回滚测试数据。

一旦测试了DAO,肯定会嘲笑他们对您的服务进行单元测试。

答案 1 :(得分:15)

通常使用DAO的想法是围绕数据访问代码设置一个最小的包装器,因此除了映射到数据库之外没有什么可以测试,并且使用模拟的单元测试是无用的。如果DAO中的实际逻辑值得使用模拟进行测试,则可能会导致您滥用DAO模式并且逻辑应该在服务中。

为了测试映射到数据库DBUnit是有用的,因为它允许您在测试之前指定起始数据集,以便您的测试从已知状态开始,并且它允许您指定结束状态数据应该是,所以你不必写很多单元测试代码断言什么是预期的。

理想情况下,如果你有一个像Hibernate这样抽象数据库的工具,你可以使用像H2或HSQLDB这样的内存数据库,这样你的测试运行得更快,而且没有数据库可以创建。如果您必须使用真实数据库,请确保您的测试自己拥有,以便他们可以创建和删除数据,而不会影响或受其他进程的影响。实际上,在本地和CI环境中都有自己的数据库是不可能的,并且使用内存数据库更加实用。

答案 2 :(得分:3)

在Koya anwers上补充,您可以使用HSQLDB进行DAO测试。我想你在项目中使用了Spring和Hibernate。您需要单独的配置文件来指向HSQLDB,您需要在执行测试之前插入数据。使用HSQLDB可以做些什么有一些限制,但是通常可以用作查询和连接。使用此解决方案可以在连续环境中使用,例如jenkins。 集成测试可以使用HSQLDB,因此这部分不会被模拟。

答案 3 :(得分:2)

我正在使用HSQLDB进行Dao和Service API测试。性能很好,它也支持事务。我没有使用EJB。我使用Hibernate。

我知道有一些问题,在不同的数据库上运行测试可能会掩盖一些受支持的数据库问题。但我认为这些问题应该被吸引到烟雾中。验收测试。

的问候, 高野

答案 4 :(得分:1)

我最终决定编写可以在容器外部运行的单元测试,使用活动数据库,并且对于事务支持使用独立事务管理器(Bitronix),我也能够回滚。我想这不会使测试纯单元测试仍然... ...很想听听你对这种方法的观点。