50

特定のコレクションに特定のアイテムが特定の順序で含まれているかどうかを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")); 
4

6 に答える 6

62

contains代わりにマッチャーを使用できますが、おそらく最新バージョンのハムクレストを使用する必要があります。そのメソッドは順序をチェックします。

assertThat(list, contains("foo", "boo"));

containsInAnyOrder順序が重要でない場合は、使用してみることもできます。

containsこれがマッチャーのコードです。

  public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers)
  {
    return IsIterableContainingInOrder.contains(itemMatchers);
  }
于 2013-03-25T06:58:07.110 に答える
9

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

javadocから:

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

JavaHamcrest2.0.0.0の実際。

お役に立てれば。

于 2015-06-18T12:14:56.900 に答える
2

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

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"));
}
于 2013-03-25T07:00:08.890 に答える
1

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

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

そこで、自分でIsIterableContainingInRelativeOrderを作成し、パッチとして送信しました

于 2014-04-23T19:16:47.750 に答える
1

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

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

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

org.hamcrest.Matchers.contains基本的に、contains Matcher( )を使用する必要があります

于 2015-01-12T17:56:35.297 に答える
0

isequalToマッチャーライブラリを組み合わせることができます。assertステートメントは長く見えますが、エラーメッセージの方が優れています。は最初に失敗するためcontains、最初の不一致が見つかると壊れ、リストのさらに下の失敗は見つかりません。isequalToは、すべての不一致が表示されるリスト全体を印刷します。

使用例contains

List<String> list = Arrays.asList("foo", "bar", "boo");
assertThat(list, contains("foo", "boo", "bar"));

次のエラーメッセージが表示されます。

Expected: iterable containing ["foo", "boo", "bar"]
 but: item 1: was "bar"

使用例is and equalTo

List<String> list = Arrays.asList("foo", "bar", "boo");
assertThat(list, is(equalTo(Lists.newArrayList("foo", "boo", "bar"))));

次のエラーメッセージが表示されます。

Expected: is <[foo, boo, bar]>
     but: was <[foo, bar, boo]>

2番目の方法では、不一致がどこにあるかをインデックスで確認できませんが、失敗メッセージを1回だけ確認することでテストを修正できるため、これはさらに優れています。一方、方法1では、最初にインデックス1を修正し、テストを実行し、インデックス2で不一致を検出して、最終的な修正を行います。

于 2019-10-30T19:13:55.470 に答える