rou*_*tic 9 tdd spring hibernate foreign-keys hsqldb
我正在使用HSQLDB进行数据层集成测试,这很棒.但是,我发现我的外键约束妨碍了我的测试.例如,要在一个表上测试一个简单的选择,我必须将虚拟数据插入另外五个表中.这让我想扔东西.
我在整个模型代码中都有JPA注释,并已配置Hibernate以在配置中重新创建模式(hbm2ddl.create-drop).生成表时,连接被正确解释为外键约束.
我想要的是:
如果它有用,我使用Spring来自动测试这些测试.有问题的测试继承自AbstractTransactionalJUnit4SpringContextTests.
你怎么看?可以这样做吗?
您可以使用以下指令停用FK约束:
SET REFERENTIAL_INTEGRITY FALSE;
Run Code Online (Sandbox Code Playgroud)
您可以Statement在测试方法之前通过JDBC执行它(并将其设置为TRUE之后).
尝试使用平面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)
| 归档时间: |
|
| 查看次数: |
6787 次 |
| 最近记录: |