Прежде всего, спасибо за эту замечательную библиотеку, это действительно здорово.XMLUnit 2.0 - Невозможно избежать сравнения заказов с пользовательским селектором элементов
У меня возникла проблема сравнения элементов в другом порядке в моем документе xml. Я разработал пользовательский ElementSelector для использования с NodeMatcher (позже код), но все же он, похоже, проверяет на основе порядка элементов больше, чем содержимое элемента. Позвольте мне написать пример
управления
<Parent>
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<Email>[email protected]</Email>
</Person>
<Person>
<FirstName>Mickey</FirstName>
<LastName>Mouse</LastName>
<Email>[email protected]</Email>
</Person>
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<Email />
</Person>
</Parent>
Тест
<Parent>
<Person>
<FirstName>Mickey</FirstName>
<LastName>Mouse</LastName>
<Email>[email protected]</Email>
</Person>
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<Email>[email protected]</Email>
</Person>
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<Email />
</Person>
</Parent>
Как я сделал Diff
Diff diff = DiffBuilder.compare(refSource)
.withTest(testSource)
.checkForSimilar()
.ignoreWhitespace()
.normalizeWhitespace()
.withNodeMatcher(new DefaultNodeMatcher(selector))
.build();
Как я создал селектор ElementSelector
ElementSelector selector = ElementSelectors.conditionalBuilder()
.whenElementIsNamed("Person").thenUse(new PersonNodeMatcher())
.defaultTo(ElementSelectors.byNameAndText).build();
Как на самом деле реализован PersonNodeMatcher
public class PersonNodeMatcher extends BaseElementSelector {
@Override
protected boolean canBeCompared(Element control, Element test) {
String controlFirstName = control.getElementsByTagName("FirstName").item(0).getTextContent();
String controlLastName = control.getElementsByTagName("LastName").item(0).getTextContent();
Node controlEmailNode = control.getElementsByTagName("Email").item(0);
String controlEmail = null;
if (controlEmailNode != null) {
controlEmail = controlEmailNode.getTextContent();
}
String testFirstName = test.getElementsByTagName("FirstName").item(0).getTextContent();
String testLastName = test.getElementsByTagName("LastName").item(0).getTextContent();
Node testEmailNode = test.getElementsByTagName("Email").item(0);
String testEmail = null;
if (testEmailNode != null) {
testEmail = testEmailNode.getTextContent();
}
return bothNullOrEqual(controlFirstName,testFirstName) &&
bothNullOrEqual(controlLastName,testLastName) &&
bothNullOrEqual(controlEmail,testEmail);
}
Процедура по-прежнему проверять узлы в порядке, так что они никогда не будут соответствовать. Я думал, что предоставление узлового узла узлового узла я мог бы проверить все элементы с предоставленным именем tagName.
Я делаю что-то неправильно или просто невозможно?
[UPDATE] Использование alpha3 я должен был сделать некоторые изменения в коде, а именно:
ElementSelector selector = ElementSelectors.conditionalBuilder()
.whenElementIsNamed("Person").thenUse(new PersonNodeMatcher()).build();
Diff diff = DiffBuilder.compare(refSource)
.withTest(testSource)
.checkForSimilar()
.ignoreWhitespace()
.normalizeWhitespace()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.or(selector,ElementSelectors.Default)))
.build();
какая альфа XMLUnit 2 вы используете? Это может быть реализация conditionalBuilder до alpha3 - https: // github.com/xmlunit/xmlunit/issues/40 –
Я использовал alpha2, теперь я пытаюсь использовать alpha3 – Kerruba
[Update]. Аналогичная проблема с alpha3 кажется неспособной выбрать правильный элемент управления. – Kerruba