assertThat - hamcrest - リストがソートされているかどうかを確認する 質問する

assertThat - hamcrest - リストがソートされているかどうかを確認する 質問する

わかりました。短い質問になると思います。日付で並べ替えた ArrayList があります。もちろん、動作していることはわかりますが、テストも書きたいと思っています。

リスト内の次の値 (日付) が前の値より小さいかどうかを確認したいです。 some fors を使用して一時リストを追加することでそれを行うことができますが、もっと簡単な解決策があるかどうか疑問に思っています。 hamrest のドキュメントで、オブジェクト (リスト、マップなど) を反復処理する (hamrest contains) のようなものがあると読みましたcontainsが、次に何をすればよいのかまだわかりません。

ベストアンサー1

[第一選択肢]: 独自の Matcher を書くことができます。次のようなものになります (免責事項: これは単なるサンプル コードであり、テストされておらず、完璧ではない可能性があります)。

@Test
  public void theArrayIsInDescendingOrder() throws Exception
  {
    List<Integer> orderedList = new ArrayList<Integer>();
    orderedList.add(10);
    orderedList.add(5);
    orderedList.add(1);
    assertThat(orderedList, isInDescendingOrdering());
  }

  private Matcher<? super List<Integer>> isInDescendingOrdering()
  {
    return new TypeSafeMatcher<List<Integer>>()
    {
      @Override
      public void describeTo (Description description)
      {
        description.appendText("describe the error has you like more");
      }

      @Override
      protected boolean matchesSafely (List<Integer> item)
      {
        for(int i = 0 ; i < item.size() -1; i++) {
          if(item.get(i) <= item.get(i+1)) return false;
        }
        return true;
      }
    };
  }

この例ではIntegers を使用していますが、 s でも簡単に実行できますDate

[2番目のオプション]containsOP の質問の への参照に基づくと、を使用するよりも、元のリストを順序付けた 2 番目のリストを作成できますassertThat(origin, contains(ordered))。この方法では、要素が期待どおりの順序になっていない場合に指摘されるため、最終的なエラーがより正確に記述されます。たとえば、このコード

@Test
  public void testName() throws Exception
  {
    List<Integer> actual = new ArrayList<Integer>();
    actual.add(1);
    actual.add(5);
    actual.add(3);
    List<Integer> expected = new ArrayList<Integer>(actual);
    Collections.sort(expected);
    assertThat(actual, contains(expected.toArray()));
  }

説明を生成します

java.lang.AssertionError: 
Expected: iterable containing [<1>, <3>, <5>]
     but: item 1: was <5>
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.junit.Assert.assertThat(Assert.java:865)
    at org.junit.Assert.assertThat(Assert.java:832)
    ...

おすすめ記事