Предположим, я хочу провести модульное тестирование метода с этой подписью:
List<MyItem> getMyItems();
Предположим MyItem
, что Pojo имеет множество свойств, одно из которых "name"
доступно через getName()
.
Все, что мне нужно для проверки, это то, что объект List<MyItem>
или any Iterable
содержит два MyItem
экземпляра, "name"
свойства которых имеют значения "foo"
и "bar"
. Если какие-либо другие свойства не совпадают, мне наплевать на цели этого теста. Если имена совпадают, это успешный тест.
Я бы хотел, чтобы он был однострочным, если это возможно. Вот какой-то «псевдосинтаксис» того, чем я хотел бы заниматься.
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Подойдет ли Хамкрест для таких вещей? Если да, то какой именно будет версия моего псевдосинтаксиса, описанного выше?
источник
Это не особенно Hamcrest, но я думаю, что стоит упомянуть здесь. То, что я довольно часто использую в Java8, выглядит примерно так:
(Отредактировано для небольшого улучшения Родриго Маньяри. Это немного менее многословно. См. Комментарии.)
Это может быть немного сложнее читать, но мне нравится тип и безопасность рефакторинга. Это также здорово для одновременного тестирования нескольких свойств bean-компонентов. например, с java-подобным выражением && в лямбда-фильтре.
источник
Assertj хорош в этом.
Большой плюс assertj по сравнению с hamcrest - простота использования автозавершения кода.
источник
AssertJ предоставляет отличную возможность
extracting()
: вы можете передаватьFunction
s для извлечения полей. Он обеспечивает проверку во время компиляции.Вы также можете легко сначала указать размер.
Это даст:
containsExactlyInAnyOrder()
утверждает, что список содержит только эти значения в любом порядке.Чтобы утверждать, что список содержит эти значения в любом порядке, но может также содержать другие значения, используйте
contains()
:В качестве побочного примечания: чтобы утверждать несколько полей из элементов a
List
, с помощью AssertJ мы делаем это , упаковывая ожидаемые значения для каждого элемента вtuple()
функцию:источник
Пока ваш List является конкретным классом, вы можете просто вызвать метод contains (), если вы реализовали свой метод equals () в MyItem.
Предполагается, что вы реализовали конструктор, который принимает значения, которые вы хотите утверждать. Я понимаю, что это не в одной строке, но полезно знать, какое значение отсутствует, а не проверять оба сразу.
источник
AssertJ 3.9.1 поддерживает прямое использование предикатов в
anyMatch
методе.Обычно это подходящий вариант использования для произвольно сложных условий.
Для простых условий я предпочитаю использовать
extracting
метод (см. Выше), потому что результирующая итерация при тестировании может поддерживать проверку значений с лучшей читабельностью. Пример: он может предоставлять специализированный API, такой какcontains
метод в ответе Фрэнка Неблунга. Или выanyMatch
все равно можете вызвать его позже и использовать ссылку на метод, например"searchedvalue"::equals
. Также вextracting
метод могут быть включены несколько экстракторов , результат впоследствии проверяется с помощьюtuple()
.источник