当前位置: 首页 > 知识库问答 >
问题:

XMLUnit断言相等XML不相等

汝天宇
2023-03-14

在我的JUnit测试中,我将预期的XML文件与解析器创建的虚拟文档进行比较:

public void test() throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();

    try (InputStream input = getClass().getResourceAsStream("expected.xml");) {
        Document expectedDocument = builder.parse(input);
        Document actualDocument = createVirtualDocument();

        XMLTestCase.assertXMLEqual(expectedDocument, actualDocument);
    }
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="text/ecmascript" contentStyleType="text/css" preserveAspectRatio="xMidYMid meet" version="1.0" zoomAndPan="magnify">
  <g class="group">
    <rect class="shape" height="40.0" width="30.0" x="10.0" y="20.0"/>
  </g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" preserveAspectRatio="xMidYMid meet" version="1.0">
  <g class="group">
    <rect x="10.0" width="30.0" height="40.0" y="20.0" class="shape"/>
  </g>
</svg>
[not identical] Expected attribute value explicitly specified 'true' but was 'false' - comparing <svg contentScriptType="text/ecmascript"...> at /svg[1]/@contentScriptType to <svg contentScriptType="text/ecmascript"...> at /svg[1]/@contentScriptType
[not identical] Expected attribute value explicitly specified 'true' but was 'false' - comparing <svg contentStyleType="text/css"...> at /svg[1]/@contentStyleType to <svg contentStyleType="text/css"...> at /svg[1]/@contentStyleType
[not identical] Expected attribute value explicitly specified 'true' but was 'false' - comparing <svg preserveAspectRatio="xMidYMid meet"...> at /svg[1]/@preserveAspectRatio to <svg preserveAspectRatio="xMidYMid meet"...> at /svg[1]/@preserveAspectRatio
[not identical] Expected attribute value explicitly specified 'true' but was 'false' - comparing <svg version="1.0"...> at /svg[1]/@version to <svg version="1.0"...> at /svg[1]/@version
[not identical] Expected attribute value explicitly specified 'true' but was 'false' - comparing <svg zoomAndPan="magnify"...> at /svg[1]/@zoomAndPan to <svg zoomAndPan="magnify"...> at /svg[1]/@zoomAndPan
[different] Expected presence of child node 'g' but was 'null' - comparing <g...> at /svg[1]/g[1] to  at null
Diff difference = new Diff(expectedDocument, actualDocument);
difference.overrideElementQualifier(new ElementNameAndAttributeQualifier());

但区别声称并不相似。那么如何正确比较这两个XML文档呢?

共有1个答案

东门佐
2023-03-14

那太蠢了。如果我不比较文档而是将它们转换为字符串并比较这些字符串,那么代码就可以工作:

ByteArrayOutputStream expected = new ByteArrayOutputStream();
storeXml(expectedDocument, expected);

ByteArrayOutputStream actual = new ByteArrayOutputStream();
storeXml(actualDocument, actual);

assertXMLEqual(expected.toString(), actual.toString());

与:

protected static void storeXml(Document document, OutputStream out) throws Exception {
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.transform(new DOMSource(document), new StreamResult(out));
}
 类似资料:
  • 我找到了junit的解决方案,但需要TestNG的解决方案。还有比编写一个自己的for循环更有用的想法吗?

  • 我收到以下错误: 对于我的Junit测试中的这行代码,请注意,

  • 我在Codewars.com参加培训测试, 说明是: 在此kata中,您必须在给定字符串的情况下,用字母在字母表中的位置替换每个字母。 如果文本中的任何内容不是字母,请忽略它,不要返回它。“A”=1,“B”=2. 我已经制作了这样的PHP脚本 但当我提交我的答案时,它包含的错误就像 请谁能帮忙修一下?告诉我为什么它显示错误的细节?

  • 更新 更准确地说。我想知道这两个列表是否有相同的对象,两个列表都没有额外的对象,顺序无关紧要。例如:

  • 13.3. 示例: 深度相等判断 来自reflect包的DeepEqual函数可以对两个值进行深度相等判断。DeepEqual函数使用内建的==比较操作符对基础类型进行相等判断,对于复合类型则递归该变量的每个基础类型然后做类似的比较判断。因为它可以工作在任意的类型上,甚至对于一些不支持==操作运算符的类型也可以工作,因此在一些测试代码中广泛地使用该函数。比如下面的代码是用DeepEqual函数比较

  • 本文向大家介绍相等相关面试题,主要包含被问及相等时的应答技巧和注意事项,需要的朋友参考一下