26

次のスニペットを調べます。

    assertThat(
        Arrays.asList("1x", "2x", "3x", "4z"),
        not(hasItem(not(endsWith("x"))))
    );

これは、リストに「x」で終わらない要素がないことを表明します。もちろん、これは、リストのすべての要素が「x」で終わることを示す二重否定の方法です。

スニペットがスローすることにも注意してください。

java.lang.AssertionError: 
Expected: not a collection containing not a string ending with "x"
     got: <[1x, 2x, 3x, 4z]>

これは、「x」で終わらない要素だけではなく、リスト全体をリストします。

だから、慣用的な方法があります:

  • 各要素が「x」で終わることを主張する (二重否定なし)
  • アサーション エラーの場合、「x」で終わらない要素のみを一覧表示する
4

3 に答える 3

23

あなたが探しているeveryItem()

assertThat(
    Arrays.asList("1x", "2x", "3x", "4z"),
    everyItem(endsWith("x"))
);

これにより、素晴らしい失敗メッセージが生成されます。

Expected: every item is a string ending with "x"
     but: an item was "4z"
于 2011-05-13T20:05:07.070 に答える
17

David Harknessによって与えられたマッチャーは、期待される部分に対して素晴らしいメッセージを生成します。ただし、実際のパーツのメッセージは、使用する方法によっても決まりassertThatます。

JUnit( )からのものorg.junit.Assert.assertThatは、提供した出力を生成します。

  • マッチャーnot(hasItem(not(...)))付き:

    java.lang.AssertionError: 
    Expected: not a collection containing not a string ending with "x"
         got: <[1x, 2x, 3x, 4z]>
    
  • マッチャーeveryItem(...)付き:

    java.lang.AssertionError: 
    Expected: every item is a string ending with "x"
         got: <[1x, 2x, 3x, 4z]>
    

Hamcrest( )からのものorg.hamcrest.MatcherAssert.assertThatは、Davidによって与えられた出力を生成します。

  • マッチャーnot(hasItem(not(...)))付き:

    java.lang.AssertionError: 
    Expected: not a collection containing not a string ending with "x"
         but: was <[1x, 2x, 3x, 4z]>
    
  • マッチャーeveryItem(...)付き:

    java.lang.AssertionError: 
    Expected: every item is a string ending with "x"
         but: an item was "4z"
    

Hamcrestアサーションを使った私自身の実験では、複数のマッチャーがどのように組み合わされ、どれが最初に失敗するかによって、「しかし」の部分がしばしば混乱することがわかりました。したがって、私はまだJUnitアサーションに固執しています。 「得た」部分で確認します。

于 2011-05-13T20:19:16.153 に答える
3

私はこの質問がかなり古いことを知っていますが、今日、Java 8 では、ラムダで書きたいと思います。

Stream.of("1x", "2x", "3x", "4z").allMatch(e->e.endsWith("x"));

これが理由です。

于 2015-04-28T22:24:10.547 に答える