我正在使用HSQLDB进行数据层集成测试,这很棒 . 但是,我发现我的外键约束妨碍了我的测试 . 例如,要在一个表上测试一个简单的选择,我必须将虚拟数据插入另外五个表中 . 这让我想扔东西 .
我在整个模型代码中都有JPA注释,并已配置Hibernate以在配置中重新创建模式(hbm2ddl.create-drop) . 生成表时,连接被正确解释为外键约束 .
我想要的是:
-
最初不创建外键(理想,最干净),或
-
找到一种以编程方式删除数据库中所有外键的方法(有点hacky但会完成工作)
如果它_____48440_ m使用Spring来自动测试这些测试 . 有问题的测试继承自AbstractTransactionalJUnit4SpringContextTests .
你怎么看?可以这样做吗?
5 回答
您可以使用以下指令停用FK约束:
您可以在测试方法之前通过JDBC
Statement
执行它(并在之后将其设置回TRUE
) .尝试使用平面xml数据集测试我的DAO时遇到了同样的问题 . Config是DBunit HSQLDB 2.2.8 JUnit4 Spring JPA->一起导致
通过实现扩展
AbstractTestExecutionListener
的侦听器,我找到了一个很好的解决方法 . 您可以指定在每次测试之前要采取的操作类型,在我们的示例中,禁用外键约束 . NOTE: the syntax may differ depending of the version of HSQLDB used.然后,您只需要在测试中已经存在的集合中添加此侦听器:
基于这个主题的灵感,我为这个问题创建了一些更强大的解决方案 . 关键是,我在运行测试时非常喜欢约束,所有其他解决方案都让它被禁用 . 此代码仅在数据集导入期间禁用它们,然后重新启用它们 . 并且可以轻松扩展以支持另一个数据库引擎:
我会考虑花一些时间来创建几个灯具,可能还有DBUnit,你可以插入@Before .
BTW,AbstractTransactionalJUnit4Test在Spring 3.0中已弃用
做快点:
SET REFERENTIAL_INTEGRITY FALSE;
进入测试资源目录中的import.sql
文件 .问题解决得很快很好:)
以下是有关
import.sql
http://christopherlakey.com/articles/import-sql.html的一些信息