Чем различаются hasItems, содержит и содержит InAnyOrder Hamcrest?
Hamcrest предоставляет несколько средств сопоставления для утверждения содержимого коллекции. Все эти случаи проходят:
Collection<String> c = ImmutableList.of("one", "two", "three");
assertThat(c, hasItems("one", "two", "three");
assertThat(c, contains("one", "two", "three");
assertThat(c, containsInAnyOrder("one", "two", "three");
Как hasItems
, contains
а также containsInAnyOrder
отличаются?
1 ответ
hasItems
проверяет:
последовательные проходы по проверенной итерируемой доходности хотя бы одного предмета, равного соответствующему предмету из указанного
items
,
То есть он гарантирует, что коллекции содержат по крайней мере эти элементы в любом порядке. Так,
assertThat(c, hasItems("one", "two"));
также пройдет, при этом дополнительный элемент игнорируется. А также:
assertThat(c, hasItems("three", "two", "one"));
также пройдет.
contains
проверяет:
один проход по обследованному
Iterable
возвращает серию элементов, каждый из которых логически равен соответствующему элементу в указанных элементах. Для положительного совпадения проверяемая итерация должна иметь ту же длину, что и количество указанных элементов.
Поэтому он гарантирует, что коллекция содержит именно эти элементы:
assertThat(c, contains("one", "two")); // Fails
Это потерпит неудачу, как остаток "three"
не соответствует.
assertThat(c, contains("three", "two", "one")); // Fails
Это не удается, потому что соответствующие элементы не совпадают.
Другой связанный матч, containsInAnyOrder
проверяет наличие именно этих элементов, но в любом порядке:
Создает порядок сопоставления заказов для
Iterables
совпадает, когда один проходIterable
возвращает серию элементов, каждый из которых логически равен одному элементу в любом месте указанных элементов.
Тест с отсутствующим элементом не пройден:
assertThat(c, containsInAnyOrder("one", "two")); // Fails
Но все предметы в другом порядке пройдут:
assertThat(c, containsInAnyOrder("three", "two", "one"));