第4节中提出了通过dbunit插件来自动管理测试数据,但是在实际操作时发现了一些问题,在设计数据库表时各个表之间可能存在外键关联,在我们准备测试数据库时经常会遇到因外测试数据外键问题导致无法插入数据或者是在清理测试数据的时候因为测试数据的顺序问题导致测试数据无法删除成功,如何解决这个问题?
这里使用了一种比较傻瓜但是也比较直接的方式--临时将数据库的外键约束删除,测试完成后将数据恢复到先前状态。
操作步骤
1.在AbstractDatasetProviderListener类的beforeTest方法之前将外键约束去除
String[] tables = dataSet.getTableNames(); if(tables != null){ for(String table : tables){ databaseTester.getConnection().getConnection().prepareStatement("ALTER TABLE "+table+" NOCHECK CONSTRAINT all").execute(); } } databaseTester.onSetup();获取当前的数据集中所操作的表,让后对每个表执行disable外键约束操作,再执行onSetup操作
2.在AbstractDatasetProviderListener类德afterTest方法执行后添加外键约束
databaseTester.setTearDownOperation(InsertIdentityOperation.DELETE); databaseTester.onTearDown(); String[] tables = databaseTester.getDataSet().getTableNames(); if(tables != null){ for(String table : tables){ databaseTester.getConnection().getConnection().prepareStatement("ALTER TABLE "+table+" CHECK CONSTRAINT ALL").execute(); } }是步骤1的反步骤,在将测试数据情理完毕后对先前disable掉的外键逐个启用外加约束功能
问题&小结
问题是解决掉了,但是还是存在一定的问题,如我们在实际的测试前将外键约束去掉了,如果在实际的业务类中出现的数据库操作也没有依照外键约束来操作数据,这个时候数据库是不会报错的,这样可能导致一种问题-在单元测试的时候结果是正确的(外键约束无效),但是在实际的环境下结果却出错了(数据违背了约束)