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

Как проверить, содержит ли коллекция элементы в указанном порядке, используя 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")); 
4b9b3361

Ответ 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)