基于值的 XmlUnit 顺序

XmlUnit order based on value

我在 JUnit 测试中将保存的示例 xml 与实时编组的 xml 进行比较。验证 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 匹配器或带有 ElementSelector 的 DefaultNodeMatchers。

是的,您需要提供一个 ElementSelector "knows" 在您的特定情况下选择哪些节点进行比较。

对于大多数文档,元素的名称似乎是您应该使用的名称。至少 entrieskeyvalue 是这样。对于 entry 元素,您想比较那些元素,这些元素在 key 元素中具有匹配的嵌套文本,是它们的直接子元素,对吗?

我认为这可以转化为

ElementSelectors.conditionalBuilder()
    .whenElementIsNamed("entry")
    .thenUse(ElementSelectors.byXPath("./key", ElementSelectors.byNameAndText))
    .elseUse(ElementSelectors.byName)
    .build();

有关 ElementSelector 选项的更详细讨论,请参阅 https://github.com/xmlunit/user-guide/wiki/SelectingNodes。您的 XML 与介绍中使用并在下一节中讨论的 table 示例非常接近。