我使用DBUnit(版本2.4.9)来加载集成测试的数据。我遇到一个奇怪的问题,即DB(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"/>
无效。
答案 0 :(得分:1)
dbUnit的“功能”是第一行定义列,然后忽略第二行中未声明的列!
解决方案分为两步:
dataset.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;
}
答案 1 :(得分:0)
这似乎是dbunit的“功能”。要避免此行为,您必须提供dtd来定义列。
<!ATTLIST organisation
id CDATA #REQUIRED
parent_id CDATA #IMPLIED
>