Frage

Ich habe eine Klasse mit einem ToString Methode, die XML erzeugt.Ich möchte es einem Unit-Test unterziehen, um sicherzustellen, dass gültiges XML erzeugt wird.Ich habe eine DTD, mit der ich das XML validieren kann.

Sollte ich die DTD als String in den Unit-Test einbinden, um eine Abhängigkeit zu vermeiden? darauf, oder gibt es eine intelligentere Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Wenn Ihr Programm das XML während der normalen Ausführung anhand der DTD validiert, sollten Sie die DTD einfach von der Stelle abrufen, an der Ihr Programm sie erhält.

Wenn nicht und die DTD extrem kurz ist (nur ein paar Zeilen), dann ist es wahrscheinlich in Ordnung, sie als String in Ihrem Code zu speichern.

Andernfalls würde ich es in eine externe Datei einfügen und Ihren Unit-Test es aus dieser Datei lesen lassen.

Andere Tipps

Ich habe verwendet XmlUnit in der Vergangenheit und fand es nützlich.

Es kann verwendet werden, um XML anhand eines Schemas zu validieren oder Ihr XML mit einer Zeichenfolge zu vergleichen.Es ist klug genug, die Parsing-Regeln von XML zu verstehen.Es weiß beispielsweise, dass „<e1/>“ äquivalent zu „<e1></e1>“ ist und kann so konfiguriert werden, dass Leerzeichen ignoriert oder eingeschlossen werden.

Die Verwendung einer DTD im Unit-Test zum Testen ihrer Gültigkeit ist eine Sache, das Testen auf den korrekten Inhalt eine andere.

Sie können die DTD verwenden, um die Gültigkeit der generierten XML-Datei zu überprüfen, was ich einfach so lesen würde, wie Sie es in Ihrem Programm tun.Ich persönlich würde es nicht inline (als String) einbinden;Es besteht immer eine Abhängigkeit zwischen Ihrem Anwendungscode und dem Komponententest.Wenn sich die generierte XML ändert, ändert sich auch die DTD.

Um den richtigen Inhalt zu testen, würde ich mich dafür entscheiden XMLUnit.

XML mit XMLUnit beanspruchen:

XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);

Diff diff = new Diff(expectedDocument, obtainedDocument);
XMLAssert.assertXMLIdentical("xml invalid", diff, true);

Eine Sache, auf die Sie möglicherweise stoßen, ist die Tatsache, dass die generierte XML möglicherweise sich ändernde Bezeichner (id/uid-Attribute oder ähnliches) enthält.Dies kann durch die Verwendung von a gelöst werden DifferenzListener beim Bestätigen der generierten XML-Datei.

Beispielimplementierung eines solchen DifferenceListener:

public class IgnoreVariableAttributesDifferenceListener implements DifferenceListener {

    private final List<String> IGNORE_ATTRS;
    private final boolean ignoreAttributeOrder;

    public IgnoreVariableAttributesDifferenceListener(List<String> attributesToIgnore, boolean ignoreAttributeOrder) {
        this.IGNORE_ATTRS = attributesToIgnore;
        this.ignoreAttributeOrder = ignoreAttributeOrder;
    }

    @Override
    public int differenceFound(Difference difference) {
        // for attribute value differences, check for ignored attributes
        if (difference.getId() == DifferenceConstants.ATTR_VALUE_ID) {
            if (IGNORE_ATTRS.contains(difference.getControlNodeDetail().getNode().getNodeName())) {
                return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
            }
        }
        // attribute order mismatch (optionally ignored)
        else if (difference.getId() == DifferenceConstants.ATTR_SEQUENCE_ID && ignoreAttributeOrder) {
            return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
        }
        // attribute missing / not expected
        else if (difference.getId() == DifferenceConstants.ATTR_NAME_NOT_FOUND_ID) {
            if (IGNORE_ATTRS.contains(difference.getTestNodeDetail().getValue())) {
                return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
            }
        }

        return RETURN_ACCEPT_DIFFERENCE;
    }

    @Override
    public void skippedComparison(Node control, Node test) {
        // nothing to do
    }
}

mit DifferenceListener:

    XMLUnit.setIgnoreWhitespace(true);
    XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);

    Diff diff = new Diff(expectedDocument, obtainedDocument);
    diff.overrideDifferenceListener(new IgnoreVariableAttributesDifferenceListener(Arrays.asList("id", "uid"), true));

    XMLAssert.assertXMLIdentical("xml invalid", diff, true);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top