在 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 trueNodes会比较。 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) {

}