测试Hibernate DAO,而不是围绕它构建Universe

时间:2010-05-27 18:00:07

标签: java unit-testing hibernate spring junit

我们有一个使用spring / Hibernate / MySQL构建的应用程序,现在我们想测试DAO层,但这里有一些我们面临的缺点。

考虑多个对象相互连接的用例,例如:Book有Pages。

  • 如果没有Book,则Page对象不能存在,因为book_id是Page的强制性FK。
  • 为了测试页面,我必须创建一本书。

这个简单的用例很容易管理,但是如果你开始构建一个库,直到你没有创建围绕Book和Page的整个Universe,你就无法测试它!

所以要测试Page;

  • 创建库
  • 创建部分
  • 创建流派
  • 创建作者
  • 创建图书
  • 创建页面
  • 现在测试页面。

有没有一种简单的方法可以通过这个“宇宙创建”并只是单独测试页面对象。我还希望能够测试与Page相关的HQL。例如:

SELECT new com.test.BookPage (book.id, page.name) FROM Book book, Page page.

JUnit应该是孤立运行的,所以我必须编写代码来构建测试用例中的所有支持对象来创建Page。有关如何加速该过程的任何提示。

编辑: Spring在测试运行后遵循事务回滚的原则,从而恢复所有更改。随着我们的进一步发展,我们希望能够对模式进行更改,我希望能够定期对生产数据库(备份!)进行测试。

2 个答案:

答案 0 :(得分:5)

我刚刚完成了一个具有这种确切配置的项目。我们使用替代HSQLDB数据库进行单元测试,然后关闭这些测试的模式的参照完整性,取得了巨大的成功。

由于您使用的是Spring,因此以下是这些步骤:

  1. 创建新的上下文配置文件以进行测试。设置hibernate以对此配置中的架构执行create-drop
  2. 创建junit测试。继承自宇宙历史中最伟大的抽象类AbstractTransactionalJUnit4SpringContextTests,并使用新的@ContextConfiguration注释该类。还可以使用@TransactionConfiguration批注在自动回滚的事务中运行每个测试。
  3. 运行命令“SET REFERENTIAL_INTEGRITY FALSE;”通过@Before方法中继承的simpleJdbcTemplate属性。
  4. 将@Before的其余部分专用于设置数据库的simpleJdbcTemplate调用。请注意,您不再需要指定每个引用的列,只需指定您正在测试的内容!
  5. 最后针对您的DAO编写单元测试。
  6. 以下是一些可以帮助您朝这个方向前进的参考资料:

    像往常一样,让配置恰到好处是困难的部分。但是一旦它全部工作,你将成为一个造型单元测试员!

答案 1 :(得分:3)

对junit或testng的Unitils扩展有非常好的支持。它们允许您定义为测试中的类调整的数据集,因此它只需要您的类所看到的Universe部分,然后在测试开始之前初始化数据库。

结帐:link text

我们正在使用它,它运作正常。比之前我们使用的“MockRepositories”更好的是不测试HQL,也很重要的是hibernate事务行为。