Подтвердить что ты не робот

Как Hamcrest hasItems, содержит и содержитInAnyOrder отличается?

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 отличаются?

4b9b3361

Ответ 1

hasItems проверяет:

последовательные проходы над рассмотренным Iterable дают по крайней мере один элемент, который равен соответствующему элементу из указанного 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"));