Вопрос

У меня есть класс с ToString метод, создающий XML.Я хочу провести модульное тестирование, чтобы убедиться, что он создает действительный XML.У меня есть DTD для проверки XML.

Должен ли я включать DTD в виде строки в модульный тест, чтобы избежать зависимости на этом, или есть более разумный способ сделать это?

Это было полезно?

Решение

Если ваша программа проверяет XML на соответствие DTD во время нормального выполнения, вам следует просто получить DTD оттуда, где его получит ваша программа.

Если нет и DTD очень короткий (всего несколько строк), то, вероятно, можно сохранить его в виде строки в коде.

В противном случае я бы поместил его во внешний файл, и ваш модульный тест прочитал бы его из этого файла.

Другие советы

я использовал XmlUnit в прошлом и нашел это полезным.

Его можно использовать для проверки XML на соответствие схеме или сравнения XML со строкой.Он достаточно умен, чтобы понимать правила синтаксического анализа XML.Например, он знает, что «<e1/>» эквивалентен «<e1></e1>» и может быть настроен на игнорирование или включение пробелов.

Использование DTD в модульном тесте для проверки его достоверности — это одно, а проверка правильности содержимого — другое.

Вы можете использовать DTD для проверки достоверности сгенерированного XML-файла, который я бы просто прочитал так же, как вы это делаете в своей программе.Лично я бы не стал включать его в строку (как строку);всегда существует зависимость между кодом вашего приложения и модульным тестом.Когда сгенерированный XML изменится, DTD также изменится.

Чтобы проверить правильность содержания, я бы выбрал XMLUnit.

Утверждение XML с помощью XMLUnit:

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

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

Вы можете столкнуться с тем, что сгенерированный XML-код может содержать изменяющиеся идентификаторы (атрибуты id/uid и т.п.).Это можно решить, используя Слушатель разницы при утверждении сгенерированного XML.

Пример реализации такого 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
    }
}

используя 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top