Pull to refresh

Comments 17

А можно и так — пропарсить хмлы, и сравнить объекты в памяти.
Кроме очевидных минусов, есть плюсы:
1. не нужны дополнительные библиотеки
2. невалидные хмлы не пропарсятся (можно даже валидацию по схеме включить)
3. структура не имеет значения
Можно. см. 3-й ответ в 4-ой ссылке из списка литературы статьи.

1. Мне такой вариант тоже показался излишне громоздким.
2. Реализуя такой вариант мы фактически пишем свой XmlUnit. Это изобретение велосипеда, чего не хотелось бы.
3. Что такого страшного в ещё одной зависимости maven? Я же не в ручную её качаю и ставлю при каждой сборке…

фактически мои тесты в проекте свелись к
Diff diff = new Diff(..);
assertTrue("XML результат не совпал", diff.similar());

По-моему достаточно быстро и компактно.
И ещё кое-что:

Порядок тегов в документе может быть важен — в некоторых схемах xsd документ может стать невалидным, если несоблюдён порядок тегов. Это не относится к порядку аттрибутов.
приведите пример, когда важен порядок элементов.
если не ошибаюсь, <xsd:sequence></xsd:sequence>
да, вот:
«The indicator specifies that the child elements must appear in a specific order:»
спасибо большое за ссылку, не знал что порядок влияет.

Если есть необходимость, то на соответствие схеме XSD тоже можно проверять.

Например, так:
String example = "<....>";
  Validator v = new Validator(example);
  v.useXMLSchema(true);
  v.setJAXP12SchemaSource(new File("xml/example.xsd"));
  assertTrue(v.toString(), v.isValid());


Спасибо и Вам. Обязательно вспомню про XmlUnit, когда мне придётся сравнивать xml, или понадобятся другие плюшки.
Но пока что тесты работают и так, проверяя «сложение вычитанием», т.е. сериализуем, а потом десериализуем обратно и сравниваем с оригиналом.
Если говорить строго о валидности XML.
XMLUnit умеет проверять DTD при помощи класса Validator
Долго колебался, включать ли пример его использования в статью или нет. Потом подумал, что это совсем отдельная тема, которую парой примеров не раскрыть.
К тому же, в моих проектах XML-данные не ограниченны DTD.
Поэтому для себя решил, что про это как-нибудь в следующий раз, в другой статье.
а только DTD или есть поддержка XSD?
  @Test
  public void testSomeXmlGeneration() {
     // здесь подготавливаются данные для генератора
     String result = someModule.generateXML();
     Diff diff = new Diff(getResourceAsString("/expeced_data.xml"), result);
     assertTrue("XML результат не совпал", diff.similar());
     Tools.showXmlDiff(diff);
  }



assertTrue и Tools.showXmlDiff, IMNSHO, необходимо поменять местами.
Иначе в случае непрохождения теста, когда нам как раз и интересны различия в файлах, мы их не увидим, т.к. assertTrue выкинет исключение.
Да, вы правы, не туда вставил. Спасибо большое.
Из коробки — нет.
Если сильно извратиться, думаю можно как-то подружить…
Но, ИХМО, смысла нет никакого. Вот тут точно можно десериализовать в два объекта и сравнить. Это будет достаточно легко.
Вдруг кому то поможет.
Этот код у меня не заработал:
@Before
public void setUp() throws Exception {
    XMLUnit.setIgnoreComments(true);
    XMLUnit.setIgnoreWhitespace(true);
}

Выдавал.
java.lang.NullPointerException
	at net.sf.saxon.Controller.prepareInputTree(Controller.java:1386)
	at net.sf.saxon.Controller.transform(Controller.java:1318)
	at org.custommonkey.xmlunit.Transform.transformTo(Transform.java:211)
	at org.custommonkey.xmlunit.Transform.getResultDocument(Transform.java:233)
	at org.custommonkey.xmlunit.XMLUnit.stripWhiteSpaceUsingXSLT(XMLUnit.java:515)
	at org.custommonkey.xmlunit.XMLUnit.getWhitespaceStrippedDocument(XMLUnit.java:508)
	at org.custommonkey.xmlunit.Diff.getWhitespaceManipulatedDocument(Diff.java:182)
	at org.custommonkey.xmlunit.Diff.getManipulatedDocument(Diff.java:203)
	at org.custommonkey.xmlunit.Diff.<init>(Diff.java:155)
	at org.custommonkey.xmlunit.Diff.<init>(Diff.java:145)
	at org.custommonkey.xmlunit.Diff.<init>(Diff.java:109)
	at org.custommonkey.xmlunit.Diff.<init>(Diff.java:101)
	at org.custommonkey.xmlunit.Diff.<init>(Diff.java:93)
	at .


Зато работает такая конструкция
    @Before
    public void setUp() throws Exception {
        XMLUnit.setTransformerFactory(
                "org.apache.xalan.processor.TransformerFactoryImpl");
        XMLUnit.setIgnoreComments(true);
        XMLUnit.setIgnoreWhitespace(true);
    }
:
Sign up to leave a comment.

Articles