1

私の 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 ファイルが等しい (または最終的に類似している) 場合でも、アサーションは失敗します。XML ファイルは次のようになります。

<?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>

そしてもう1つは:

<?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>

つまり、属性の順序が異なります。XMLUnit.setIgnoreAttributeOrder(true)私はすでにと を試しXMLUnit.setNormalize(true)ましたが、役に立ちませんでした。

テストが失敗したときに表示されるメッセージは次のとおりです。

[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());

しかし、違いは似ていないと主張しています。では、これら 2 つの XML ドキュメントを正しく比較するにはどうすればよいでしょうか。

4

1 に答える 1

0

それはただ愚かです。Documents を比較せずに文字列に変換して比較すると、コードは機能します。

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));
}
于 2014-11-14T11:05:33.363 に答える