2015-09-06 57 views
2

我使用XMLUnit比较下面的XML的XMLUnit测试预计数是真实的,但是是假

XML 1

<element1> 
</element1> 
<element2> Some Text </element2> 

XML 2

<element1/> 
<element2>Some Text</element2> 

我期待只有元素2进来的差异,但我得到这样的区别element1

“子节点的预期存在为真,但为假”。
“预期数量的子节点1,但为0”
“子节点‘#text’的预期存在,但为空。

我知道这可以setIgnoreWhiteSpace走开,但我想element2空白差异。

+0

两个元素的空白方面不同,有效的 - 你为什么会想到在element2表现出差异,但不部件1? –

回答

2

<element1/><element1></element1>应该返回相同的,但你有你的标签之间的newline,所以这是一个1个或2个字符的文本节点(根据换行符是CR LF或只是LF)。

由于您没有告诉解析器忽略空白,因此它会给出您在源数据中找到的所有内容。由您决定如何处理它。

-1

正如其他人提到的,XMLUnit将<element1>中的文本(由新行组成)视为子节点。其他XML中的<element1>不是有任何子节点(甚至没有空文本)。

如果你想忽略这样的差异,你必须编写自定义DifferenceListener

Diff diff = new Diff(doc1, doc2); 
diff.overrideDifferenceListener(new DifferenceListener() { 

    ... 

    @Override 
    public int differenceFound(Difference difference) { 
     if(difference.getId() == DifferenceConstants.HAS_CHILD_NODES_ID) { 
      Node controlNode = difference.getControlNodeDetail().getNode(); 
      Node testNode = difference.getTestNodeDetail().getNode(); 

      if(controlNode.getChildNodes().getLength() == 0) { 
       Node childNode = testNode.getChildNodes().item(0); 
       // note the trim method call 
       if(childNode.getNodeType() == Node.TEXT_NODE 
          && childNode.getTextContent().trim().isEmpty()) { 
        return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; 
       } 
      } else { // we're sure the other node has children in the else part 
       Node childNode = controlNode.getChildNodes().item(0); 
       if(childNode.getNodeType() == Node.TEXT_NODE 
          && childNode.getTextContent().trim().isEmpty()) { 
        return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; 
       } 
      } 
     } 
     return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; 
    } 
}); 
+0

在这种情况下,没有理由定制'DifferenceListener',只要告诉XMLUnit通过'XMLUnit.setIgnoreWhitespace(true)'来忽略元素内容空白。 –

+0

@StefanBodewig这也将忽略OP不想要的其他差异。 – manouti

+0

你是对的,我误读了要求 - 现在和Jon Skeet在一起。 –

相关问题