Порядок XmlUnit на основе значения
Я сравниваю сохраненный пример xml с живым маршалом xml в моем тестировании JUnit. Проверка наличия пары ключ-значение в xml.
Я использую XmlUnit 2.1.0 специально
Мой xml выглядит следующим образом:
<entries>
<entry>
<key>delete</key>
<value>ENABLED</value>
</entry>
<entry>
<key>view</key>
<value>DISABLED</value>
</entry>
<entry>
<key>create</key>
<value>DISABLED</value>
</entry>
</entries>
Порядок записей может варьироваться. Я не уверен, как заставить это проверить правильно, так как он видит другое значение ключа как разницу в XML, даже если это просто изменение порядка.
Я утверждаю сходство со следующим утверждением в JUnit:
assertThat(marshalledXml, isSimilarTo(Input.fromFile("path/to/example.xml").ignoreWhitespace().ignoreComments());
Я подозреваю, что мне может понадобиться использовать сопоставители XPath или DefaultNodeMatchers с ElementSelector.
1 ответ
Да, вам нужно предоставить ElementSelector
который "знает", какие узлы выбрать для сравнения в вашем конкретном случае.
Кажется, что для большей части документа имя элемента должно быть тем, что вы должны использовать. По крайней мере, это верно для entries
, key
а также value
, За entry
элементы, которые вы хотите сравнить те элементы, которые имеют соответствующий вложенный текст в key
элемент, который является их непосредственным ребенком, верно?
Я думаю, что это переводится как
ElementSelectors.conditionalBuilder()
.whenElementIsNamed("entry")
.thenUse(ElementSelectors.byXPath("./key", ElementSelectors.byNameAndText))
.elseUse(ElementSelectors.byName)
.build();
См. https://github.com/xmlunit/user-guide/wiki/SelectingNodes для более подробного обсуждения ElementSelector
опции. Ваш XML довольно близок к table
Пример используется во введении и обсуждается в следующих разделах.