java Doc4j:由于元素类型不同,比较两个文档失败
我试图为我编写的Docx4J生成器编写一些JUnit测试。 我想将生成器的输出节点与希望从字符串加载的预期节点进行比较
因此,我创建“实际”节点(生成器输出),如下所示:
Node xmlNodeActual = XmlUtils.marshaltoW3CDomDocument(actual).getDocumentElement();
其中“实际”是由生成器创建的对象
对于我的“预期”节点,我编写了以下代码:
Document doc = docBuilder.parse(new InputSource(new ByteArrayInputStream(strXmlNode.getBytes("utf-8")))):
Node xmlNodeExpected = doc.getDocumentElement();
strXmlNode是一个包含所需xml的字符串。 虽然我的两个节点从视觉差异上看是相等的,但调用以下命令会产生“false”结果:
xmlNodeActual.isEqualNode(xmlNodeExpected)
我怀疑原因是这两个节点的运行时类型不同:
- xmlNodeActual:org。阿帕奇。薛西斯。多姆。推迟实施
- xmlNodeExpected:org。阿帕奇。薛西斯。多姆。ElementsImpl
我喜欢我的测试设计,因为它允许我为一个大型生成器快速编写大量测试用例。然而,我看不到将这种方法与“isEqualNode”结合使用的方法。 我是否必须编写自己的比较器,或者是否有一种我不知道的方法来确保节点的类型相同
# 1 楼答案
使用这种方法的一个问题是,它只给出了一个布尔值的答案,而没有告诉您这两个节点之间的实际差异是什么。另一个问题是,你不能告诉你你认为重要的区别:例如(就我所见),冗余命名空间声明被这个特定方法认为是重要的。空白通常是有问题的。我在使用XPath deep-equal()方法时遇到了同样的问题,因此编写了saxon:deep-equal变量。但我现在更喜欢使用一组XPath断言来测试预期结果。W3C XSLT测试套件将此技术用于以下测试断言:
我曾经有一个小工具,可以从XML文档生成这样一个断言列表,但现在我倾向于手动执行。最大的优点是,如果出现问题,诊断将告诉您哪个断言失败