【问题标题】:Spring/Hibernate testing: Inserting test data after DDL creationSpring/Hibernate 测试:在 DDL 创建后插入测试数据
【发布时间】:2011-03-25 10:51:02
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您在谈论 JUnit 测试并使用 AbstractTransactionalDataSourceSpringContextTests,那么您可以覆盖像 onSetupBeforeTransaction 这样的方法,它们提供了一个挂钩来预填充测试表数据等。

    【讨论】:

      【解决方案2】:

      我正在尝试找到一种方法告诉 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 并设置 createcreate-drop 作为你的 hibernate.hbm2ddl.auto 属性。

      我将它用于休眠搜索 现在我已经开始行动了 查询章节。它初始化我的 具有一组新数据的数据库 我的单元测试。 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,他 写了一个很好的关于它的小条目。 记住如果你想添加额外的 数据库对象(索引、表和 等等),你也可以使用辅助 数据库对象功能。

      它仍然没有真正记录下来。

      【讨论】:

      • 太棒了!我找不到太多关于它的文档,但它可以像宣传的那样工作。谢谢!
      • @CaptainAwesomePants:不客气。它实际上是一个未记录的功能。我将添加“公告”。
      • @Pascal Thivent 嗨,帕斯卡,我知道。看看 Emmanuel Bernard 在这里说了什么:stackoverflow.com/questions/2108178/…,让我知道你的想法
      • @ArthurRonaldFDGarcia:你好亚瑟。我很难理解 Emmanuel 的回答,但我想我现在明白了。 Emmanuel 实际上是在回复 OP 在another answer 上留下的评论,说 “在启动时我想设置一个 id 为 0 的‘无用户’”。为此,OP 确实可以使用import.sql。但这与更通用的原始问题有很大不同。 Emmanuel 的回答不涵盖最初的通用问题,仅涵盖实际的具体要求。
      • @Pascal Thivent 很奇怪!
      【解决方案3】:

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

      hibernate.hbm2ddl.import_files

      查看http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/,注意到文档中有错误:属性是import_files,末尾有一个s。

      【讨论】:

        猜你喜欢
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多