Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试Hibernate DAO,而不在其周围构建宇宙_Java_Unit Testing_Hibernate_Spring_Junit - Fatal编程技术网

Java 测试Hibernate DAO,而不在其周围构建宇宙

Java 测试Hibernate DAO,而不在其周围构建宇宙,java,unit-testing,hibernate,spring,junit,Java,Unit Testing,Hibernate,Spring,Junit,我们有一个使用spring/Hibernate/MySQL构建的应用程序,现在我们想测试DAO层,但这里有一些缺点 考虑多个对象相互连接的用例,例如:书有页 页面对象在没有书本的情况下不能存在,因为书本id在页面中是必需的FK 为了测试页面,我必须创建一本书 这个简单的用例很容易管理,但是如果你开始构建一个库,直到你没有创建围绕书籍和页面的整个宇宙,你就无法测试它 所以要测试页面 创建库 创建节 创建流派 创建作者 创作书籍 创建页面 现在测试页面 有没有一种简单的方法可以绕过这个“宇宙

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

考虑多个对象相互连接的用例,例如:书有页

  • 页面对象在没有书本的情况下不能存在,因为书本id在页面中是必需的FK
  • 为了测试页面,我必须创建一本书
这个简单的用例很容易管理,但是如果你开始构建一个库,直到你没有创建围绕书籍和页面的整个宇宙,你就无法测试它

所以要测试页面

  • 创建库
  • 创建节
  • 创建流派
  • 创建作者
  • 创作书籍
  • 创建页面
  • 现在测试页面
有没有一种简单的方法可以绕过这个“宇宙创造”,单独测试页面对象。我还希望能够测试与页面相关的HQL。例如:

SELECT new com.test.BookPage (book.id, page.name) FROM Book book, Page page.
JUnit应该独立运行,因此我必须编写代码来构建测试用例中的所有支持对象,以创建页面。关于如何加速这一过程的任何提示


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

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

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

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


    和往常一样,要正确配置是很困难的。但一旦一切正常,您将成为一名造型单元测试人员

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

    结帐:


    我们正在使用它,它工作得很好。比我们之前使用的“MockRepositories”要好得多,它不测试HQL,也不测试hibernate事务行为。

    我不喜欢关闭引用完整性,即使是为了测试。每个人都有自己的引用完整性。我发现,从单元测试的角度来看,当我删除引用完整性时,我的测试夹具被切成了两半。因为我只对测试HQL查询感兴趣,而不是DB模式配置,所以它工作得非常好。此外,由于它是一个完全不同的数据库系统--在内存中--因此不必担心损坏任何生产数据。我们不让hibernate生成模式,我们只需将对象映射到SQL,并运行hbm2ddl验证以确保它符合标准。我们还希望确保模式配置是正确的,这是测试阶段的一部分。Unitils看起来很有希望,让我进一步探讨一下,然后再与您联系。Unitils提供的不仅仅是数据库功能,例如宽松的集合匹配器。这是一个好东西,在你的工具带。