Spring / Hibernate测试:在DDL创建后插入测试数据

时间:2010-08-04 19:14:57

标签: java unit-testing hibernate spring test-data

我有一个Spring / Hibernate webapp,它有一些在内存中的HSQL数据库上运行的集成测试。由于hbm2ddl = create,Hibernate使用这个空白数据库并创建我的所有测试表和约束。但是,我有一个新的bean,它在afterPropertiesSet()方法中检查数据库中的特定配置值,因此当初始化此bean时,数据库中需要存在这样的行。

有没有什么好方法可以设置一个类似于Rail的测试装置的Java / Spring / Hibernate?我试图找到一种方法告诉Hibernate“无论何时创建此表,然后立即插入这些行”。我找不到可以添加的回调或挂钩,但也许还有另一种方式。

3 个答案:

答案 0 :(得分:27)

  

我正试图找到一种方法告诉Hibernate“无论何时创建此表,然后立即插入这些行”

从Hibernate 3.1开始,你可以在Hibernate的运行时类路径中包含一个名为import.sql的文件,在模式导出时,Hibernate将在导出模式后执行该文件中包含的SQL语句。

此功能已在Rotterdam JBug and Hibernate's import.sql博文中宣布:

  

import.sql: easily import data in your unit tests

     

Hibernate有一个简洁的小功能   这是严重缺乏记录和   未知。您可以执行SQL脚本   在SessionFactory创建期间   就在数据库架构之后   生成以新鲜的方式导入数据   数据库。您只需要添加一个文件   在类路径中命名为import.sql   root并设置create或   create-drop作为你的   hibernate.hbm2ddl.auto财产。

     

我用它来进行Hibernate Search   现在就开始行动了   查询章节。它初始化了我的   带有一组新数据的数据库   我的单元测试。 JBoss Seam也使用它   在各种例子中有很多。   import.sql是一个非常简单的功能   但是在时间上非常有用。记得   SQL可能依赖于   你的数据库(啊便携性!)。

#import.sql file
delete from PRODUCTS
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...');
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');
     

有关此内容的更多信息   功能,检查Eyal's blog,他   写了一篇关于它的精彩小条目。   请记住,如果您想添加其他内容   数据库对象(索引,表和   等等),你也可以使用辅助   数据库对象功能。

仍然没有真正记录。

答案 1 :(得分:6)

在hibernate 3.6中,允许运行任意sql命令的配置是:

hibernate.hbm2ddl.import_files

请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/,注意文档中存在错误:属性为import_files,最后带有s。

答案 2 :(得分:1)

如果您正在讨论JUnit测试并使用AbstractTransactionalDataSourceSpringContextTests,您可以覆盖类似onSetupBeforeTransaction的方法,这些方法提供了预先填充测试表数据等的挂钩。