2014-01-17 2 views
1

Я использую DBUnit (версия 2.4.9) для загрузки данных для тестов интеграции. Я получаю странную проблему, что 1 поле (deleted) равно не установлено в БД (postgres).DBUnit игнорирует элемент xml

Вот мой 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 
) 

Все остальные поля обрабатываются корректно настройки. Любые идеи, что может быть причиной этого? Благодаря!

EDIT:

я сузил проблему, и он должен сделать что-то с записями в порядке 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?

EDIT: Другой пример, который я не могу преодолеть:

<organisation id="1"/> 
<organisation id="2" parent_id="1"/> 

Организация должна существует, прежде чем мы можем присвоить ему значение, поэтому обходной путь, как это:

<organisation id="2" parent_id="1"/> 
<organisation id="1"/> 

не будет Работа.

ответ

0

Похоже, что это «особенность» dbunit. Чтобы избежать такого поведения, вы должны указать dtd для определения столбцов.

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

«особенность» DBUnit является то, что первая строка определяет столбцы, то необъявленная столбцы второй строки игнорируются!

Решение в 2 этапа:

  • имеют все столбцы в первой строке (и во всех предыдущих файлах DBUnit). Как и в вашем
  • ВОЗМОЖНОЕ РЕШЕНИЕ
  • использование ReplacementDataSet установить «нулевой» в необходимых столбцов

dataset.xml

<organisation id="1" parent_id="[null]"/> 
    <organisation id="2" parent_id="1"/> 

И трюк, чтобы установить колонки в нуль в вашем Java тестового класса

@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; 
} 
+0

Да, это сработает. Но это более беспорядочно, чем предоставление файла dtd. – FazoM

+0

@FazoM да, это более «Java» подход. – pdem

Смежные вопросы