Pregunta

tengo una clase con un ToString método que produce XML.Quiero realizar una prueba unitaria para asegurarme de que esté produciendo un xml válido.Tengo una DTD para validar el XML.

¿Debo incluir el DTD como una cadena dentro de la prueba unitaria para evitar una dependencia? en ello, o hay una manera más inteligente de hacer esto?

¿Fue útil?

Solución

Si su programa valida el XML con el DTD durante la ejecución normal, entonces debería obtener el DTD de dondequiera que lo obtenga su programa.

Si no es así y el DTD es extremadamente corto (solo unas pocas líneas), probablemente esté bien almacenarlo como una cadena en su código.

De lo contrario, lo pondría en un archivo externo y haría que la prueba unitaria lo leyera desde ese archivo.

Otros consejos

he usado Unidad XML en el pasado y lo encontré útil.

Se puede utilizar para validar XML con un esquema o comparar su XML con una cadena.Es lo suficientemente inteligente como para comprender las reglas de análisis de XML.Por ejemplo, sabe que "<e1/>" es equivalente a "<e1></e1>" y puede configurarse para ignorar o incluir espacios en blanco.

Usar una DTD en la prueba unitaria para probar su validez es una cosa, probar el contenido correcto es otra.

Puede utilizar el DTD para comprobar la validez del xml generado, que yo simplemente leería como lo hace usted en su programa.Yo personalmente no lo incluiría en línea (como cadena);Siempre existe una dependencia entre el código de su aplicación y la prueba unitaria.Cuando el xml generado cambie, la DTD también cambiará.

Para probar el contenido correcto, elegiría Unidad XML.

Afirmando xml usando XMLUnit:

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

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

Una cosa con la que puede encontrarse es el hecho de que el xml generado puede contener identificadores cambiantes (atributos id/uid o similares).Esto se puede solucionar utilizando un Diferencia oyente al afirmar el xml generado.

Ejemplo de implementación de dicho 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
    }
}

usando 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top