【问题标题】:Testing Hibernate DAO, without building the universe around it测试 Hibernate DAO,而不围绕它构建宇宙
【发布时间】:2011-02-24 19:10:51
【问题描述】:

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

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

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

这个简单的用例很容易管理,但是如果您开始构建一个库,除非您没有创建围绕 Book 和 Page 的整个宇宙,否则您无法对其进行测试!

所以要测试页面;

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

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

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

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

编辑: Spring 遵循在测试运行后回滚事务的理念,从而恢复所有更改。随着我们进一步开发,预计架构会发生变化,我希望能够定期针对生产数据库(备份!)对其进行测试。

【问题讨论】:

    标签: java unit-testing hibernate spring junit


    【解决方案1】:

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

    结帐:link text

    我们正在使用它,它运行良好。比我们之前使用的“MockRepositories”要好得多,它不测试 HQL,同样重要的是,不测试休眠事务行为。

    【讨论】:

    • Unitils 看起来很有前景,让我进一步探索并回复您。
    • Unitils 提供的不仅仅是数据库的东西,例如。宽松的集合匹配器。随身携带工具包是件好事。
    【解决方案2】:

    我刚刚完成了一个具有这种精确配置的项目。我们为单元测试使用了一个备用 HSQLDB 数据库,然后为这些测试关闭了模式上的引用完整性,我们取得了巨大的成功。

    由于您使用的是 Spring,以下是步骤:

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

    这里有一些参考资料可以帮助您朝着这个方向前进:

    像往常一样,让配置恰到好处是困难的部分。但是一旦一切正常,您将成为样式单元测试员!

    【讨论】:

    • 即使是为了测试,我也不愿意关闭参照完整性。
    • 每个人都有自己的。我发现从单元测试的角度来看,当我删除引用完整性时,我的测试夹具被削减了一半。因为我只对测试 HQL 查询感兴趣,而不是 DB 模式配置,所以它工作得很好。此外,由于它是一个完全不同的数据库系统 - 在内存中 - 无需担心损坏任何生产数据。
    • 我们不让 hibernate 生成模式,我们只是将对象映射到 SQL,并运行 hbm2ddl 验证以确保它符合标准。我们还想确保架构配置正确,这是测试阶段的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多