Как написать собственный hamcrest matcher

содержит прекрасную библиотеку матчеров, а их комбинирование позволяет творить чудеса.  А когда их возможностей не хватает, можно написать свой собственный матчер.

Мне потребовалось проверять результат формирования параметров GET запроса:

И я столкнулся с тем, что во-первых это строка, во-вторых порядок элементов в строке не важен, поэтому сравнивать проверяемую строку с образцом нельзя. Чтобы не загромождать тест дополнительными преобразованиями, я решил написать матчер, сравнивающий строки GET параметров.

Собственный матчер

Матчер должен расширять класс BaseMatcher  и переопределять его методы, но мы будем использовать типобезопасную версию  TypeSafeMatcher

В коде матчера можно выделить три основных части — обработку строки параметров, проверку и вывод результата и фабричный метод.

Обработка параметров

Образец для сравнения передаётся в конструктор. Здесь, используя paramStringToMap, его разбирают на части и сохраняют для дальнейшего использования.

Функция paramStringToMap разделяет строку параметров на  отдельные параметры, которые складываются в хэш. Разделение строки на параметры реализовано на streams api Java 8.

Сравнение

Главная часть матчера — сюда передаётся фактическое значение и производится сравнение:

Тестовая строка просто переводится в хэш и сравнивается с образцом. Гораздо интереснее функции вывода результатов:

Функция describeTo описывает сам матчер, функция describeMismatch описывает, что матчеру не понравилось при сравнении. Содержимое этих функций и подробность отчёта целиком и полностью на совести разработчика.  Я реализовал проверку всех шагов сравнения хэшей с подробным выводом различий.

 Использование

Для удобства использования матчера в его код добавлен вспомогательный метод по созданию матчера:

Теперь матчер можно использовать как:

Можно проверить, как выводятся ошибки:

Код примера доступен на github.