我想知道人们为测试Hibernate映射和查询找到了最佳实践?
单元测试无法做到这一点,所以我的经验是编写集成测试,仅向下测试DAO层。通过这种方式,我可以完全测试每个Insert / Update / Delete / ReadQueries,而无需测试完整的端到端解决方案。
每当运行Integration测试套件时,它都会: -
我从不测试不同的“内存”数据库,因为总会有一个等价的开发数据库来测试。
我从未需要使用DBUnit。
答案 0 :(得分:4)
永远不要使用DbUnit。对于这种级别的测试来说,这是太多的开销。
特别是如果您在应用中使用Spring,请查看Spring Test Framework以帮助管理您的数据访问测试,尤其是transaction management features。
“等效开发数据库”很好,但是内存中H2 database会为了速度而吹走其他任何东西。这很重要,因为虽然这些测试的单元/集成状态可能存在争议,但它们是您想要运行很多的测试,因此它们需要尽可能快。
所以我的DAO测试看起来像这样:
SessionFactory
和TransactionManager
。foo1
,保存,加载foo2
,验证foo1
和foo2
包含相同的值。)非常轻巧,可用于快速反馈。
答案 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
但在某些情况下它仍然有用。