Обнаружена неожиданная разница при сравнении элементов с пустыми элементами в xmlUnit
Сравнивая эти два фрагмента XML:
testXml:
<ELEMENT1>
<CHILD1></CHILD1>
</ELEMENT1>
actualXml:
<ELEMENT1>
<CHILD1>notEmpty</CHILD1>
</ELEMENT1>
с помощью:
Diff diff = new Diff(testXml, actualXml);
Detailed detailedDiff = new DetailedDiff(diff);
Сейчас detailedDiff.getAllDifferences();
вернет DifferenceConstants.HAS_CHILD_NODES_ID
Разница, и если вы выводите разницу на консоль, она выглядит так:
Expected presence of child nodes to be 'false' but was 'true' - comparing <CHILD1...> at /ELEMENT1[1]/CHILD1[1] to <CHILD1...> at /ELEMENT1[1]/CHILD1[1]
У меня вопрос, почему разница типа DifferenceConstants.HAS_CHILD_NODES_ID
и не DifferenceConstants.TEXT_VALUE_ID
? Структура двух фрагментов XML одинакова, но их текстовое значение отличается.
Итак, почему это не вызывает разницу?
1 ответ
Попробуйте использовать это ElementQualifier
:
Diff diff = new Diff(testXml, actualXml);
diff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier() );
Detailed detailedDiff = new DetailedDiff(diff);
вот описание от Javadoc:
public RecursiveElementNameAndTextQualifier()
Использует имена элементов, а текст вкладывает произвольный уровень дочерних элементов глубже в элемент для сравнения элементов. Проверяет все узлы, а не только первый дочерний элемент. Не игнорирует пустые текстовые узлы.
Интересная вещь здесь - "не игнорировать пустые текстовые узлы".
Похоже, что по умолчанию ElementQualifier
обрабатывает пустые узлы как отсутствующий узел и проверяет только первую ошибку, связанную с одним узлом. Так что в вашем случае, возможно, выдается только "HAS_CHILD_NODES_ID" вместо включения "TEXT_VALUE_ID".
По крайней мере, RecursiveElementNameAndTextQualifier
идет глубже