2015-11-13 2 views
6

С XMLUnit 2 как вы сравниваете два документа без учета порядка элементов?Сравнение XML-игнорирования элемента порядка

У меня есть this question for XMLUnit 1, но, видимо, новый API в v2 больше не имеет указанного метода.

Это мой текущий код:

Diff diff = DiffBuilder.compare(expected) 
      .withTest(actual) 
      .ignoreComments() 
      .ignoreWhitespace() 
      .checkForSimilar() 
      .build(); 

assertFalse(diff.hasDifferences()); 

Редактировать Стефану Bodewigs комментарий:

Эти две строки я сравнить с выше фрагменте кода:

String expected = "<root><foo>FOO</foo><bar>BAR</bar></root>"; 
String actual = "<root><bar>BAR</bar><foo>FOO</foo></root>"; 

в отчётном файлов изменений

Expected element tag name 'foo' but was 'bar' - comparing <foo...> at /root[1]/foo[1] to <bar...> at /root[1]/bar[1] (DIFFERENT) 
Expected text value 'FOO' but was 'BAR' - comparing <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] to <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] (DIFFERENT) 
Expected element tag name 'bar' but was 'foo' - comparing <bar...> at /root[1]/bar[1] to <foo...> at /root[1]/foo[1] (DIFFERENT) 
Expected text value 'BAR' but was 'FOO' - comparing <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] to <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] (DIFFERENT) 
+0

Новый API должен игнорировать порядок элементов по умолчанию (это то, что 'DifferenceEvaluators.DEFAULT' делает). Вы уверены, что это разница, которую вы видите, а не что-то еще? –

+0

Я воспроизвел проблему OP, даже когда я добавил .checkForSimilar(). Это противоречит документации по адресу https://github.com/xmlunit/user-guide/wiki/DifferenceEvaluator#default-differenceevaluator Добавление описанного ниже .withNodeMatcher() решает проблему. –

ответ

8

Одна разница, которая может потребоваться стать более четкой в ​​документации 2.x, - это по умолчанию ElementSelector - примерно то, что раньше было ElementQualifier в 1.x. Где 1.x по умолчанию соответствуют элементам по имени, 2.x по умолчанию соответствуют элементам по порядку. Может быть, это плохая идея.

Ваш Diff должен работать, если вы переключитесь на сопоставление имен элементов.

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))

+0

Спасибо, Стефан! –

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