わかりました。短い質問になると思います。日付で並べ替えた ArrayList があります。もちろん、動作していることはわかりますが、テストも書きたいと思っています。
リスト内の次の値 (日付) が前の値より小さいかどうかを確認したいです。 some for
s を使用して一時リストを追加することでそれを行うことができますが、もっと簡単な解決策があるかどうか疑問に思っています。 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;
}
};
}
この例ではInteger
s を使用していますが、 s でも簡単に実行できますDate
。
[2番目のオプション]contains
OP の質問の への参照に基づくと、を使用するよりも、元のリストを順序付けた 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)
...