10

Integers (current) のリストがあり、このリストにリスト expected のすべての要素が含まれており、リスト notExpected の要素が 1 つも含まれていないかどうかを確認したいので、コードは次のようになります。

    List<Integer> expected= new ArrayList<Integer>();
    expected.add(1);
    expected.add(2);

    List<Integer> notExpected = new ArrayList<Integer>();
    notExpected.add(3);
    notExpected.add(4);

    List<Integer> current = new ArrayList<Integer>();
    current.add(1);
    current.add(2);


    assertThat(current, not(hasItems(notExpected.toArray(new Integer[expected.size()]))));

    assertThat(current, (hasItems(expected.toArray(new Integer[expected.size()]))));

とても良い。しかし、追加すると

    current.add(3);

テストも緑色です。hamcrest マッチャーを誤用していませんか? ところで。

    for (Integer i : notExpected)
        assertThat(current, not(hasItem(i)));

正しい答えが得られますが、ハムクレストマッチャーを簡単に使用できると思いました。私はjunit 4.11とhamcrest 1.3を使用しています

4

1 に答える 1

11

hasItems(notExpected...)currentのすべての要素notExpectedが にもある場合にのみ一致しcurrentます。だからラインで

assertThat(current, not(hasItems(notExpected...)));

からのすべての要素currentが含まれていないと主張します。notExpected

からの要素currentを含まないことをアサートする 1 つのソリューション:notExpected

assertThat(current, everyItem(not(isIn(notExpected))));

リストを配列に変換する必要さえありません。このバリアントはもう少し読みやすいかもしれませんが、配列への変換が必要です:

assertThat(current, everyItem(not(isOneOf(notExpected...))));

これらのマッチャーは からCoreMatchersのものではないことに注意してください。そのhamcrest-coreため、 への依存関係を追加する必要がありますhamcrest-library

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
</dependency>
于 2013-02-18T09:52:43.953 に答える