如何有用地使用JUnit和Hibernate?

时间:2009-12-14 08:59:46

标签: unit-testing hibernate orm junit

我想使用JUnit来测试Hibernate代码,例如insert,update,delete,..方法和事务管理。

但是我不知道如何有效地应用Hibernate的单元测试以及我应该用Hibernate测试什么。

如何测试DAO方法?

希望你能给我一些指导!

6 个答案:

答案 0 :(得分:4)

您可以使用 DBUnit 来测试DAO Layer。因为您需要测试数据。
示例: DBUnit xml会将虚拟数据插入到您描述的数据库中,然后您可以调用assertEquals(“myname”,userDAO.findById(1) .getName());测试后,您可以使用 DBUnit 删除虚拟数据。检查 detail

文件
Hibernate testing with dbunit
DBUnit and Hibernate

答案 1 :(得分:2)

您可以使用多种方法,具体取决于您的方案

  • 使用嵌入式数据库(HSQLDB)进行单元测试。在@Before中插入所有需要的数据,然后在@After中删除。然而,这并不是一个“单位”测试,因为它取决于一些外部先决条件。
  • 你可以嘲笑你的dao(例如使用Mokcito),这样它就不会干扰数据库。这在测试服务层时非常有用,而且您不关心数据库中存储的内容。

答案 2 :(得分:2)

我使用了Chris Richardson的方法,在POJO的行动书中描述

内存中SQL数据库

赞成

  • 无网络流量
  • 无光盘访问
  • 用于测试查询

缺点

  • 它的架构是否与生产数据库的架构类似?

命名查询

赞成

  • 可以与存储库分开存储,允许您在没有存储库的情况下对其进行测试

缺点

  • 使用dinamic查询时效果不佳

模拟存储库

赞成

  • 减少数据库访问
  • 减少测试用例数

缺点

  • 需要单独测试针对数据库的查询

<强> DBUnit的

赞成

  • 这是一个jUnit扩展

缺点

  • 您必须提取包含预期值的XML文件
  • 如果您错过了新的映射属性,则容易出错

的问候,

答案 3 :(得分:0)

好的,几点 首先,如果你必须测试与数据库对话的实际代码,使用DBUnit让你的生活更轻松,建议你使用HSQLDB,这样你的测试就可以设置他们的运行时环境,无需安装和配置数据库。

其次,如果你不必与数据库交谈,我会使用一般的模拟库(例如EasyMock,JMock或Mockito),并且不进行测试真正与数据库交谈,这通常会使测试更快更简单。

答案 4 :(得分:0)

就我个人而言,我非常谨慎地使用像HQLnate这样的HSQLDB等嵌入式数据库,并期望当你将它移动到Oracle / MySQL / SQL服务器时,一切都会完全相同。 Hibernate过于漏洞了。

除了JUnit之外,我没有其他框架的经验。我发现它做得很好。 以下是我一直记得的一些事情:

  • 数据库CRUD操作的单元测试绝不应预设某些数据的存在与否。插入的所有内容也应删除或回滚。
  • 确保刷新基础连接对象。这实际上将执行缓存的语句,并在数据模型上设置任何触发器。

答案 5 :(得分:0)

如果您已创建DAO对象,则可以向其发送一些对象,调用save,然后检索这些对象并测试字段值。这是非常基本的Hibernate测试。

确保在设置或拆卸方法中清理数据。如果保存对象,请将其删除。

Rails的最佳实践是使用单独的数据库进行测试,其中一个填充了测试数据。我不会对生产数据库这样做;如果您有自己的开发数据库,​​您可以轻松地重新填充数据,只需使用它。