使用org.xmlunit.diff.NodeFilters

时间:2016-07-21 15:57:22

标签: git xmlunit

我在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是什么意思?

2 个答案:

答案 0 :(得分:1)

Predicate是一个带有单test方法的函数接口,在NodeFilter的情况下,接收DOM Node作为参数并返回一个布尔值。 javadoc of Predicate

Predicate<Node>的实现可用于过滤差异引擎的节点,并且只会对Node返回Predicate的{​​{1}}进行比较。 javadoc of setNodeFilterUser-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) {

}