我正在使用 DBUnit(2.4.9 版)加载数据以进行集成测试。我遇到一个奇怪的问题,即数据库 (postgres) 中有 1 个字段 (deleted
) 未设置。
这是我的 XML 数据加载:
<dataset>
...
<workgroup id="100" created="2013-10-08 14:15:00.000" deleted="2013-10-08 14:15:00.000" version="0" name="Name1" org_id="100"/>
...
</dataset>
这是我的架构定义:
CREATE TABLE workgroup
(
deleted timestamp without time zone,
... some constraints
)
所有其他字段都已正确设置。任何想法可能是什么原因造成的?谢谢!
编辑:
我缩小了问题的范围,它必须对 XML 文件顺序中的条目进行处理。如果我有:
<workgroup id="101" version="0" name="Name1"/>
<workgroup id="100" version="0" name="Name1" deleted="2013-10-08 />
它不起作用,但是这个:
<workgroup id="100" version="0" name="Name1" deleted="2013-10-08 />
<workgroup id="101" version="0" name="Name1"/>
正常工作。 DBUnit 错误?
编辑: 另一个我无法克服的例子:
<organisation id="1"/>
<organisation id="2" parent_id="1"/>
组织需要先存在,然后我们才能为其赋值,因此解决方法如下:
<organisation id="2" parent_id="1"/>
<organisation id="1"/>
将不起作用。
最佳答案
dbUnit 的“特点”是第一行定义列,然后忽略第二行未声明的列!
解决方案分两步:
- 在第一行中包含所有列(也在所有以前的 dbunit 文件中)。就像在你的变通办法中一样
- 使用 ReplacementDataSet 在需要的列中设置“null”
数据集.xml
<organisation id="1" parent_id="[null]"/>
<organisation id="2" parent_id="1"/>
以及在 Java 测试类中将列设置为 null 的技巧
@Override
protected IDataSet getDataSet() throws Exception {
FlatXmlDataSetBuilder flatXmlDataSetBuilder = new FlatXmlDataSetBuilder();
IDataSet ds = flatXmlDataSetBuilder.build(getClass().getResource("dataset.xml"));
ds = new ReplacementDataSet(ds);
((ReplacementDataSet) ds).addReplacementObject("[null]", null);
return ds;
}
关于java - DBUnit 忽略 xml 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21183419/