测试Hibernate映射的最佳实践

时间:2011-10-16 15:03:58

标签: java hibernate integration-testing

我想知道人们为测试Hibernate映射和查询找到了最佳实践?

单元测试无法做到这一点,所以我的经验是编写集成测试,仅向下测试DAO层。通过这种方式,我可以完全测试每个Insert / Update / Delete / ReadQueries,而无需测试完整的端到端解决方案。

每当运行Integration测试套件时,它都会: -

  1. 删除并重新创建数据库。
  2. 运行包含数据子集的导入SQL脚本。
  3. 在回滚事务的事务上下文中运行每个测试。因此,它可以作为独立测试运行多次,或作为套件的一部分运行,并且由于数据库始终处于已知状态,因此返回相同的结果。
  4. 我从不测试不同的“内存”数据库,因为总会有一个等价的开发数据库来测试。

    我从未需要使用DBUnit。

3 个答案:

答案 0 :(得分:4)

永远不要使用DbUnit。对于这种级别的测试来说,这是太多的开销。

特别是如果您在应用中使用Spring,请查看Spring Test Framework以帮助管理您的数据访问测试,尤其是transaction management features

“等效开发数据库”很好,但是内存中H2 database会为了速度而吹走其他任何东西。这很重要,因为虽然这些测试的单元/集成状态可能存在争议,但它们是您想要运行很多的测试,因此它们需要尽可能快。

所以我的DAO测试看起来像这样:

  1. Spring管理SessionFactoryTransactionManager
  2. Spring处理测试方法的所有事务。
  3. Hibernate在内存H2数据库中创建当前架构。
  4. 测试所有保存,加载,删除和查找方法,对前后对象进行逐场比较。 (例如,创建对象foo1,保存,加载foo2,验证foo1foo2包含相同的值。)
  5. 非常轻巧,可用于快速反馈。

答案 1 :(得分:3)

如果您不依赖于专有的rdbms功能(触发器,存储过程等),那么您可以使用JUnit和内存数据库(如HSQLDB)轻松地完全测试您的DAO。你需要通过一个类进行一些基本的hibernate.cfg.xml仿真(用HSQLDB初始化hibernate,加载你想要的hbm.xml文件),然后将提供的数据源传递给你的daos。

运行良好,为开发生命周期提供真正的价值。

答案 2 :(得分:1)

我这样做的方式与您自己的方式非常相似,但实际使用内存数据库(如HSQLDB)除外。它比配置真实数据库(在独立服务器中运行的数据库)更快,更便携。确实,对于某些更高级的功能,HSQLDB不能正常工作,因为它根本不支持它们,但我注意到,当我只是对我的数据访问层进行集成测试时,我很难遇到这些功能。但是,如果是这种情况,我喜欢使用mysql的“jar”版本,它允许我从java启动一个功能齐全的MYSql服务器,并在我完成时将其关闭。这不是很实用,因为jar文件非常大:

http://dev.mysql.com/doc/refman/5.0/en/connector-mxj-configuration-java-object.html

但在某些情况下它仍然有用。