Java DBUnit忽略xml元素
我使用DBUnit(版本2.4.9)加载集成测试的数据。我遇到了一个奇怪的问题,即数据库(postgres)中没有设置1个字段(Java DBUnit忽略xml元素,java,xml,postgresql,postgresql-9.2,dbunit,Java,Xml,Postgresql,Postgresql 9.2,Dbunit,我使用DBUnit(版本2.4.9)加载集成测试的数据。我遇到了一个奇怪的问题,即数据库(postgres)中没有设置1个字段(已删除) 以下是我的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"/> .
已删除
)
以下是我的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>
正在正确设置所有其他字段。你知道这是什么原因吗?谢谢
编辑:
我缩小了问题的范围,它必须以XML文件顺序处理条目。如果我有:
<workgroup id="101" version="0" name="Name1"/>
<workgroup id="100" version="0" name="Name1" deleted="2013-10-08 />
工作正常。数据库单元错误
编辑:
另一个我无法克服的例子:
<organisation id="1"/>
<organisation id="2" parent_id="1"/>
在我们分配it价值之前,组织需要存在,所以解决方法如下:
<organisation id="2" parent_id="1"/>
<organisation id="1"/>
无法工作。这似乎是dbunit的一个“功能”。要避免这种行为,必须提供dtd来定义列
<!ATTLIST organisation
id CDATA #REQUIRED
parent_id CDATA #IMPLIED
>
dbUnit的“特点”是第一行定义列,然后忽略第二行中未声明的列
解决方案分为两个步骤:
- 在第一行中有所有列(也在所有以前的dbunit文件中)。就像你的工作环境一样
- 使用ReplacementDataSet在需要的列中设置“null”
<organisation id="1" parent_id="[null]"/>
<organisation id="2" parent_id="1"/>
是的,那会有用的。但它比提供dtd文件更混乱。@FazoM是的,这是一种更“Java”的方法。
<!ATTLIST organisation
id CDATA #REQUIRED
parent_id CDATA #IMPLIED
>
<organisation id="1" parent_id="[null]"/>
<organisation id="2" parent_id="1"/>
@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;
}