web-dev-qa-db-ja.com

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")); 
41
Mariusz Jamro

代わりにcontainsマッチャーを使用できますが、おそらく最新バージョンの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);
  }
51

コレクションに予想される(指定された)順序でアイテムが含まれていることを確認するには、HamcrestのcontainsInRelativeOrderメソッドを使用できます。

Javadocから:

Iterableのマッチャーを作成し、検査済みのIterableを1回パスすると、指定したアイテムの対応するアイテムと同じ相対順序で論理的に等しいアイテムを含む一連のアイテムが生成される場合に一致します。例:assertThat(Arrays.asList( " a "、" b "、" c "、" d "、" e ")、containsInRelativeOrder(" b "、" d "))。

実際のJava Hamcrest 2.0.0.0。

お役に立てれば。

7
nndru

このようなカスタムマッチャーを実装する必要があります

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"));
}
2

受け入れられた答えは私のために働いていません。それでも失敗する

Expected: iterable containing ["foo", "boo"] but: Not matched: "bar"

そこで、私は独自のIsIterableContainingInRelativeOrderを作成し、 パッチとして提出 を作成しました。

1
Kevin Pauli

http://www.baeldung.com/hamcrest-collections-arrays で解決策を見つけました

厳密な順序の例があるセクションを探してください。

List<String> collection = Lists.newArrayList("ab", "cd", "ef");
assertThat(collection, contains("ab", "cd", "ef"));

基本的には、Container Matcher(org.hamcrest.Matchers.contains

1
Andreas Guther