【问题标题】:DBUnit ignores xml elementDBUnit 忽略 xml 元素
【发布时间】:2014-01-17 10:22:49
【问题描述】:

我正在使用 DBUnit(2.4.9 版)加载数据以进行集成测试。我遇到了一个奇怪的问题,即 1 个字段 (deleted) 在数据库 (postgres) 中未设置

这是我的 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"/>

不会工作。

【问题讨论】:

    标签: java xml postgresql postgresql-9.2 dbunit


    【解决方案1】:

    dbUnit 的“特点”是第一行定义了列,然后第二行中未声明的列被忽略!

    解决方案分两步:

    • 在第一行包含所有列(也在所有以前的 dbunit 文件中)。就像在你的工作中一样
    • 使用 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;
    }
    

    【讨论】:

    • 是的,可以。但它比提供 dtd 文件更混乱。
    • @FazoM 是的,这是一种更“Java”的方法。
    【解决方案2】:

    这似乎是 dbunit 的“功能”。为避免这种行为,您必须提供一个 dtd 来定义列。

    <!ATTLIST organisation  
        id CDATA #REQUIRED  
        parent_id CDATA #IMPLIED  
    > 
    

    【讨论】: