在 XMLUnit DiffBuilder 中使用 org.xmlunit.diff.NodeFilters
Using org.xmlunit.diff.NodeFilters in XMLUnit DiffBuilder
我正在使用 JUnit 中的 XMLUnit 来比较测试结果。我有一个问题,其中我的 XML 中有一个元素将当前时间戳作为测试 运行 并且与预期输出进行比较时,结果永远不会匹配。
为了克服这个问题,我阅读了有关使用 org.xmlunit.diff.NodeFilters
的内容,但没有关于如何实现它的任何示例。我的代码片段如下,
final org.xmlunit.diff.Diff documentDiff = DiffBuilder
.compare(sourcExp)
.withTest(sourceActual)
.ignoreComments()
.ignoreWhitespace()
//.withNodeFilter(Node.ELEMENT_NODE)
.build();
return documentDiff.hasDifferences();
我的问题是,如何实施 NodeFilter
?应该传递什么参数,应该传递什么参数?没有这方面的样本。 NodeFilter
方法获取 Predicate<Node>
作为 IN 参数。 Predicate<Node>
是什么意思?
Predicate
是具有单个 test
方法的功能接口 - 在 NodeFilter
的情况下接收 DOM Node
作为参数和 returns 一个布尔值。 javadoc of Predicate
Predicate<Node>
的实现可用于过滤差异引擎的节点,并且仅过滤那些 Predicate
returns true
的 Node
s会比较。 javadoc of setNodeFilter, User-Guide
假设包含时间戳的元素称为时间戳,您将使用类似
的东西
.withNodeFilter(new Predicate<Node>() {
@Override
public boolean test(Node n) {
return !(n instanceof Element &&
"timestamp".equals(Nodes.getQName(n).getLocalPart()));
}
})
或使用 lambdas
.withNodeFilter(n -> !(n instanceof Element &&
"timestamp".equals(Nodes.getQName(n).getLocalPart())))
这使用 XMLUnit 的 org.xmlunit.util.Nodes
来更容易地获取元素名称。
下面的代码对我有用,
public final class IgnoreNamedElementsDifferenceListener implements
DifferenceListener {
private Set<String> blackList = new HashSet<String>();
public IgnoreNamedElementsDifferenceListener(String... elementNames) {
for (String name : elementNames) {
blackList.add(name);
}
}
public int differenceFound(Difference difference) {
if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) {
if (blackList.contains(difference.getControlNodeDetail().getNode()
.getParentNode().getNodeName())) {
return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
}
}
return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
}
public void skippedComparison(Node node, Node node1) {
}
我正在使用 JUnit 中的 XMLUnit 来比较测试结果。我有一个问题,其中我的 XML 中有一个元素将当前时间戳作为测试 运行 并且与预期输出进行比较时,结果永远不会匹配。
为了克服这个问题,我阅读了有关使用 org.xmlunit.diff.NodeFilters
的内容,但没有关于如何实现它的任何示例。我的代码片段如下,
final org.xmlunit.diff.Diff documentDiff = DiffBuilder
.compare(sourcExp)
.withTest(sourceActual)
.ignoreComments()
.ignoreWhitespace()
//.withNodeFilter(Node.ELEMENT_NODE)
.build();
return documentDiff.hasDifferences();
我的问题是,如何实施 NodeFilter
?应该传递什么参数,应该传递什么参数?没有这方面的样本。 NodeFilter
方法获取 Predicate<Node>
作为 IN 参数。 Predicate<Node>
是什么意思?
Predicate
是具有单个 test
方法的功能接口 - 在 NodeFilter
的情况下接收 DOM Node
作为参数和 returns 一个布尔值。 javadoc of Predicate
Predicate<Node>
的实现可用于过滤差异引擎的节点,并且仅过滤那些 Predicate
returns true
的 Node
s会比较。 javadoc of setNodeFilter, User-Guide
假设包含时间戳的元素称为时间戳,您将使用类似
的东西.withNodeFilter(new Predicate<Node>() {
@Override
public boolean test(Node n) {
return !(n instanceof Element &&
"timestamp".equals(Nodes.getQName(n).getLocalPart()));
}
})
或使用 lambdas
.withNodeFilter(n -> !(n instanceof Element &&
"timestamp".equals(Nodes.getQName(n).getLocalPart())))
这使用 XMLUnit 的 org.xmlunit.util.Nodes
来更容易地获取元素名称。
下面的代码对我有用,
public final class IgnoreNamedElementsDifferenceListener implements
DifferenceListener {
private Set<String> blackList = new HashSet<String>();
public IgnoreNamedElementsDifferenceListener(String... elementNames) {
for (String name : elementNames) {
blackList.add(name);
}
}
public int differenceFound(Difference difference) {
if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) {
if (blackList.contains(difference.getControlNodeDetail().getNode()
.getParentNode().getNodeName())) {
return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
}
}
return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
}
public void skippedComparison(Node node, Node node1) {
}