gpt4 book ai didi

java - XMLUnit 嵌套元素测试

转载 作者:行者123 更新时间:2023-11-30 06:59:09 24 4
gpt4 key购买 nike

我有两个要比较的 XML 文件。我正在使用 XMLUnit 2。但是元素可能会乱序(包括子元素排序)下面的所有三个示例都需要被视为等效:

<Product>
<Property>
<Container value="1">Test 01</Container>
<Container value="3">Test 02</Container>
<Container value="5">Test 03</Container>
</Property>
<Property>
<Container value="2">Test A</Container>
<Container value="4">Test B</Container>
<Container value="6">Test C</Container>
</Property>
</Product>
<小时/>
<Product>
<Property>
<Container value="5">Test 03</Container>
<Container value="1">Test 01</Container>
<Container value="3">Test 02</Container>
</Property>
<Property>
<Container value="2">Test A</Container>
<Container value="4">Test B</Container>
<Container value="6">Test C</Container>
</Property>

<Product>
<Property>
<Container value="2">Test A</Container>
<Container value="4">Test B</Container>
<Container value="6">Test C</Container>
</Property>
<Property>
<Container value="5">Test 03</Container>
<Container value="1">Test 01</Container>
<Container value="3">Test 02</Container>
</Property>
</Product>
<小时/>

看起来 XMLUnit 应该能够相当容易地做到这一点,但我不知道我需要做什么来配置测试。我应该补充一点,当容器下面有更多元素来演示相同的问题时,嵌套可以变得更深。

---

可能的解决方案:

public class SubNodeEqualityElementSelector implements ElementSelector {

public SubNodeEqualityElementSelector() {

}

@Override
public boolean canBeCompared(Element controlElement, Element testElement) {
// test input nodes for equality first.
if (!ElementSelectors.byNameAndAllAttributes.canBeCompared(controlElement, testElement)) {
return false;
}
if (!ElementSelectors.byNameAndText.canBeCompared(controlElement, testElement)) {
return false;
}

// test children for equality. For each ctrl child, make sure that a matching element is found in the test set.
ArrayList<Element> ctrlChildren = getChildElements(controlElement);
ArrayList<Element> testChildren = getChildElements(testElement);
ArrayList<Element> ctrlChildrenResults = new ArrayList<Element>(ctrlChildren);
ArrayList<Element> testChildrenResults = new ArrayList<Element>(testChildren);

for (Element ctrlChild : ctrlChildren) {
for (Element testChild : testChildren) {
if (ElementSelectors.byNameAndAllAttributes.canBeCompared(ctrlChild, testChild) &&
ElementSelectors.byNameAndText.canBeCompared(ctrlChild, testChild)) {
ctrlChildrenResults.remove(ctrlChild);
testChildrenResults.remove(testChild);
}
}
}

return ctrlChildrenResults.size() == 0 && testChildrenResults.size() == 0;
}

private ArrayList<Element> getChildElements(Element elem) {
ArrayList<Element> retVal = new ArrayList<Element>();

NodeList childNodes = elem.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node node = childNodes.item(i);
if (node instanceof Element){
Element element = (Element) node;
retVal.add(element);
}
}

return retVal;
}

}
<小时/>

我测试了上面的类(SubNodeEqualityElementSelector),它似乎工作得很好!

最佳答案

这是一个相当困难的例子。

如果您想使用 XMLUnit 1.x 解决这个问题,那么您必须编写 ElementQualifier 代码。选择正确的Property面对列表时的元素。您必须自己编写它,两个内置版本都不起作用。另外你只能有一个 ElementQualifier因此您还需要处理其余的比较,例如选择正确的 Container - 某事ElementNameAndAttributeQualifier本来可以做到的。

使用 XMLUnit 2.x 并没有变得容易得多,但至少您可以使用条件构建器来组合 ElementSelectorhttps://github.com/xmlunit/user-guide/wiki/SelectingNodes中的用户指南示例接近时,它会根据第一个“内部”元素的嵌套文本选择正确的“外部”元素。就您而言,您似乎需要选择 Property基于嵌套 Container 的属性s,但不幸的是,光看第一个Container还不够。 。恐怕我们不会提出一个有效的 XPath,因此您可能仍然需要编写选择正确的 Property 的 Java 代码。 ,但是一旦你明白了,你就可以做类似的事情

ElementSelectors.conditionalBuilder()
.whenElementIsNamed("Property").thenUse(YOUR_ELEMENT_SELECTOR)
.elseUse(ElementSelectors.byNameAndAllAttributes)
.build();

关于java - XMLUnit 嵌套元素测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41251393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com