我在JUnit中使用XMLUnit来比较测试结果。我有一个问题,其中我的XML中有一个元素,当测试运行时获取CURRENT TIMESTAMP,当与预期输出进行比较时,结果总是不匹配。
为了克服这个问题,我阅读了有关使用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作为IN参数。 Predicate是什么意思?
答案 0 :(得分:1)
Predicate
是一个带有单test
方法的函数接口,在NodeFilter
的情况下,接收DOM Node
作为参数并返回一个布尔值。 javadoc of Predicate
Predicate<Node>
的实现可用于过滤差异引擎的节点,并且只会对Node
返回Predicate
的{{1}}进行比较。 javadoc of setNodeFilter,User-Guide
假设包含时间戳的元素被称为时间戳,您可以使用类似
的内容true
或使用lambdas
.withNodeFilter(new Predicate<Node>() {
@Override
public boolean test(Node n) {
return !(n instanceof Element &&
"timestamp".equals(Nodes.getQName(n).getLocalPart()));
}
})
这使用XMLUnit的.withNodeFilter(n -> !(n instanceof Element &&
"timestamp".equals(Nodes.getQName(n).getLocalPart())))
来更轻松地获取元素名称。
答案 1 :(得分:0)
以下代码对我有用,
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) {
}