Как проверить, содержит ли коллекция элементы в указанном порядке, используя Hamcrest
Как проверить использование Hamcrest, если данная коллекция содержит данные в заданном порядке? Я попробовал hasItems
, но он просто игнорирует порядок.
List<String> list = Arrays.asList("foo", "bar", "boo");
assertThat(list, hasItems("foo", "boo"));
//I want this to fail, because the order is different than in "list"
assertThat(list, hasItems("boo", "foo"));
Ответы
Ответ 1
Вместо этого вы можете использовать contains
matcher, но вам, вероятно, потребуется использовать последнюю версию Hamcrest. Этот метод проверяет порядок.
assertThat(list, contains("foo", "boo"));
Вы также можете попробовать использовать containsInAnyOrder
, если заказ не имеет значения для вас.
Что код для contains
:
public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers)
{
return IsIterableContainingInOrder.contains(itemMatchers);
}
Ответ 2
Вам нужно реализовать пользовательский Matcher, что-то вроде этого
class ListMatcher extends BaseMatcher {
String[] items;
ListMatcher(String... items) {
this.items = items;
}
@Override
public boolean matches(Object item) {
List list = (List) (item);
int l = -1;
for (String s : items) {
int i = list.indexOf(s);
if (i == -1 || i < l) {
return false;
}
l = i;
}
return true;
}
@Override
public void describeTo(Description description) {
// not implemented
}
}
@Test
public void test1() {
List<String> list = Arrays.asList("foo", "bar", "boo");
Assert.assertThat(list, new ListMatcher("foo", "boo"));
Assert.assertThat(list, new ListMatcher("boo", "foo"));
}
Ответ 3
Принятый ответ не работает для меня. Он все еще терпит неудачу, говоря
Expected: iterable containing ["foo", "boo"] but: Not matched: "bar"
Итак, я написал свой собственный IsIterableContainingInRelativeOrder и отправил его как патч.
Ответ 4
Чтобы проверить, что коллекция содержит элементы в ожидаемом (заданном) заказе, вы можете использовать метод Hamcrest containsInRelativeOrder
.
Из javadoc:
Создает совпадение для Iterable, которое соответствует, когда один проход исследуемый Iterable дает ряд элементов, которые содержат элементы логически равный соответствующему элементу в указанных элементах, в тот же относительный порядок Например: assertThat (Arrays.asList( "a", "b", "c", "d", "e" ), содержитInRelativeOrder ( "b", "d" )).
Актуально для Java Hamcrest 2.0.0.0.
Надеюсь, что это поможет.
Ответ 5
Я нашел решение на http://www.baeldung.com/hamcrest-collections-arrays
Найдите раздел, в котором есть пример со строгим порядком.
List<String> collection = Lists.newArrayList("ab", "cd", "ef");
assertThat(collection, contains("ab", "cd", "ef"));
В основном вам нужно использовать содержащий Matcher (org.hamcrest.Matchers.contains
)