使用HSQLDB的TDD - 删除外键

rou*_*tic 9 tdd spring hibernate foreign-keys hsqldb

我正在使用HSQLDB进行数据层集成测试,这很棒.但是,我发现我的外键约束妨碍了我的测试.例如,要在一个表上测试一个简单的选择,我必须将虚拟数据插入另外五个表中.这让我想扔东西.

我在整个模型代码中都有JPA注释,并已配置Hibernate以在配置中重新创建模式(hbm2ddl.create-drop).生成表时,连接被正确解释为外键约束.

我想要的是:

  1. 最初不创建外键(理想,最干净),或
  2. 找到一种方法以编程方式删除数据库中的所有外键(有点hacky但会完成工作)

如果它有用,我使用Spring来自动测试这些测试.有问题的测试继承自AbstractTransactionalJUnit4SpringContextTests.

你怎么看?可以这样做吗?

Pas*_*ent 9

您可以使用以下指令停用FK约束:

SET REFERENTIAL_INTEGRITY FALSE;
Run Code Online (Sandbox Code Playgroud)

您可以Statement在测试方法之前通过JDBC执行它(并将其设置为TRUE之后).


Oli*_*AND 8

尝试使用平面xml数据集测试我的DAO时遇到了同样的问题.Config是DBunit + HSQLDB 2.2.8 + JUnit4 + Spring + JPA->一起导致

java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no parent; FK13EE6CE6F09A6AAC table: ****
Run Code Online (Sandbox Code Playgroud)

我通过实现一个监听器扩展找到了一个很好的解决方法AbstractTestExecutionListener.您可以指定在每次测试之前要采取的操作类型,在我们的示例中,禁用外键约束. 注意:语法可能因使用的HSQLDB版本而异.

public class ForeignKeyDisabling extends AbstractTestExecutionListener {    
    @Override
    public void beforeTestClass(TestContext testContext) throws Exception {
        IDatabaseConnection dbConn = new DatabaseDataSourceConnection(
                testContext.getApplicationContext().getBean(DataSource.class)
                );
        dbConn.getConnection().prepareStatement("SET DATABASE REFERENTIAL INTEGRITY FALSE").execute();

    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需要在测试中已经存在的集合中添加此侦听器:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"applicationContext-test.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DataSetTestExecutionListener.class, ForeignKeyDisabling.class})
Run Code Online (Sandbox Code Playgroud)