DBUnit忽略xml元素

时间:2014-01-17 10:22:49

标签: java xml postgresql postgresql-9.2 dbunit

我使用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"/>

无效。

2 个答案:

答案 0 :(得分:1)

dbUnit的“功能”是第一行定义列,然后忽略第二行中未声明的列!

解决方案分为两步:

  • 包含第一行中的所有列(也包含在所有以前的dbunit文件中)。就像你的workAround一样
  • 使用ReplacementDataSet在所需列中设置“null”

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  
>