Порядок 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 Пример используется во введении и обсуждается в следующих разделах.

Другие вопросы по тегам