The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Hamcrest - мой любимый инструмент в модульном тестировании. Он заменяет процедурные утверждения org.junit.Assert
в JUnit на объектно-ориентированный механизм. Однако, я подробнее расскажу об этом позже.
Теперь, однако, я хочу продемонстрировать новую библиотеку, опубликованную сегодня на GitHub и Maven Central: jcabi-matchers. jcabi-matchers - это набор матчеров Hamcrest для выполнения XPath-утверждений в XML и XHTML-документах.
Допустим, например, что класс, проходящий тестирование, создает XML, в котором должен содержаться единственный элемент <message>
с содержимым “hello, world!”
Вот как выглядел бы этот код в модульном тесте:
Есть два альтернативных варианта, о которых я знаю, и они делают почти то же самое: xml-matchers от Дэвида Эрингера и метод hasXPath()
в самом Hamcrest.
Я пробовал оба варианта, но столкнулся с несколькими проблемами.
Во-первых, Hamcrest hasXPath()
работает только с экземпляром Node
. С использованием этого метода преобразование String
в Node
становится рутинной задачей в каждом модульном тесте.
Вышеупомянутое является очень странной ограниченностью Hamcrest в сравнении с jcabi-matchers, которая работает с практически чем угодно, от String
до Reader
и даже InputStream
.
Во-вторых, XmlMatchers
из xml-matchers предоставляет очень неудобный способ работы с пространствами имен. Прежде чем использовать запрос XPath с нестандартным пространством имен, необходимо создать экземпляр NamespaceContext
.
Библиотека предоставляет простую реализацию этого интерфейса, но все равно требуется дополнительный код в каждом модульном тесте.
jcabi-matchers упрощает работу с пространствами имен еще больше, так как в ней предопределены наиболее популярные пространства имен, включая xhtml
, xs
, xsl
и т.д.
Следующий пример работает сразу после установки—без дополнительной настройки:
В общем, моя основная цель при создании библиотеки была ее простота использования.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 15:59