Java 测试Hibernate DAO,而不在其周围构建宇宙
我们有一个使用spring/Hibernate/MySQL构建的应用程序,现在我们想测试DAO层,但这里有一些缺点 考虑多个对象相互连接的用例,例如:书有页Java 测试Hibernate DAO,而不在其周围构建宇宙,java,unit-testing,hibernate,spring,junit,Java,Unit Testing,Hibernate,Spring,Junit,我们有一个使用spring/Hibernate/MySQL构建的应用程序,现在我们想测试DAO层,但这里有一些缺点 考虑多个对象相互连接的用例,例如:书有页 页面对象在没有书本的情况下不能存在,因为书本id在页面中是必需的FK 为了测试页面,我必须创建一本书 这个简单的用例很容易管理,但是如果你开始构建一个库,直到你没有创建围绕书籍和页面的整个宇宙,你就无法测试它 所以要测试页面 创建库 创建节 创建流派 创建作者 创作书籍 创建页面 现在测试页面 有没有一种简单的方法可以绕过这个“宇宙
- 页面对象在没有书本的情况下不能存在,因为书本id在页面中是必需的FK
- 为了测试页面,我必须创建一本书
- 创建库
- 创建节
- 创建流派
- 创建作者
- 创作书籍
- 创建页面
- 现在测试页面
SELECT new com.test.BookPage (book.id, page.name) FROM Book book, Page page.
JUnit应该独立运行,因此我必须编写代码来构建测试用例中的所有支持对象,以创建页面。关于如何加速这一过程的任何提示
编辑:Spring遵循测试运行后事务回滚的原理,因此恢复所有更改。随着我们的进一步开发,模式会发生变化,我希望能够定期对生产数据库(备份!)进行测试。我刚刚完成了一个具有这种精确配置的项目。我们在单元测试中使用了一个替代HSQLDB数据库,然后在这些测试中关闭了模式的引用完整性,取得了巨大的成功 由于您使用的是Spring,以下是步骤:
create drop
AbstractTransactionalJUnit4SpringContextTests
,并使用新的@ContextConfiguration
注释该类。还可以使用@TransactionConfiguration
注释以自动回滚的方式运行事务中的每个测试和往常一样,要正确配置是很困难的。但一旦一切正常,您将成为一名造型单元测试人员 junit或testng的Unitils扩展对此有很好的支持。它们允许您定义为被测类调优的数据集,这样它只需要类看到的宇宙的一部分,然后在测试开始之前初始化数据库 结帐:
我们正在使用它,它工作得很好。比我们之前使用的“MockRepositories”要好得多,它不测试HQL,也不测试hibernate事务行为。我不喜欢关闭引用完整性,即使是为了测试。每个人都有自己的引用完整性。我发现,从单元测试的角度来看,当我删除引用完整性时,我的测试夹具被切成了两半。因为我只对测试HQL查询感兴趣,而不是DB模式配置,所以它工作得非常好。此外,由于它是一个完全不同的数据库系统--在内存中--因此不必担心损坏任何生产数据。我们不让hibernate生成模式,我们只需将对象映射到SQL,并运行hbm2ddl验证以确保它符合标准。我们还希望确保模式配置是正确的,这是测试阶段的一部分。Unitils看起来很有希望,让我进一步探讨一下,然后再与您联系。Unitils提供的不仅仅是数据库功能,例如宽松的集合匹配器。这是一个好东西,在你的工具带。