Domanda

Ho una lezione con a ToString metodo che produce XML.Voglio testarlo per assicurarmi che stia producendo un xml valido.Ho un DTD per convalidare l'XML.

Dovrei includere il DTD come stringa all'interno del test unitario per evitare una dipendenza su di esso o esiste un modo più intelligente per farlo?

È stato utile?

Soluzione

Se il tuo programma convalida l'XML rispetto alla DTD durante la normale esecuzione, dovresti semplicemente ottenere la DTD da qualunque posto il tuo programma la otterrà.

In caso contrario e il DTD è estremamente breve (solo poche righe), probabilmente è corretto memorizzarlo come stringa nel codice.

Altrimenti, lo inserirei in un file esterno e lo farei leggere dal tuo unit test da quel file.

Altri suggerimenti

ho usato XmlUnit in passato e l'ho trovato utile.

Può essere utilizzato per convalidare XML rispetto a uno schema o confrontare il tuo XML con una stringa.È abbastanza intelligente da comprendere le regole di analisi di XML.Ad esempio, sa che "<e1/>" è equivalente a "<e1></e1>" e può essere configurato per ignorare o includere gli spazi bianchi.

Usare un DTD nello unit test per testarne la validità è una cosa, testare il contenuto corretto è un'altra.

Puoi utilizzare il DTD per verificare la validità dell'xml generato che leggerei semplicemente come fai tu nel tuo programma.Personalmente non lo includerò in linea (come String);c'è sempre una dipendenza tra il codice dell'applicazione e lo unit test.Quando l'xml generato cambia, cambierà anche il DTD.

Per testare il contenuto corretto, vorrei optare per XMLUnit.

Asserzione di xml utilizzando XMLUnit:

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

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

Una cosa che potresti riscontrare è il fatto che l'xml generato potrebbe contenere identificatori modificati (attributi id/uid o simili).Questo può essere risolto utilizzando a Differenza Ascoltatore quando si afferma l'xml generato.

Esempio di implementazione di tale 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
    }
}

utilizzando 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top