JUnit を使用しているため、v4.4 の時点で、ライブラリはテスト式を構築するための豊富な DSL を提供するhamcrestマッチャー ライブラリを使用できます。これは、ループを完全に削除して単一のアサーションを記述し、すべての期待値の存在をテストできることを意味します。
たとえば、hamcrest には組み込み関数がありますhasItems()
(v1.3.RC2 のドキュメント リンクがありますが、v1.3 は公開されていません。最新のリンクが見つかりませんでした)。
import java.util.List;
import java.util.Arrays;
import static org.hamcrest.Matchers.hasItems;
import static org.junit.Assert.assertThat;
@Test
public void bothValuesShouldBePresent() {
List<Integer> itemValues = Arrays.asList(new Integer[]{ 0, 1, 2, 3 });
Integer[] expected = { 0, 1 };
assertThat(itemValues, hasItems(expected));
}
getItems()
もちろん、これは単純な を返すようにメソッドを変更できることを前提としていますList<Integer>
。
最後に、使用している JUnit のバージョンによって、hamcrest がバンドルされている場合とバンドルされていない場合があります。JUnit は、v4.4 と v4.10 の間で hamcrest-core をインライン化しました。hamcrest-coreだけだったので、プロジェクトにhamcrest-all依存関係を明示的に追加しました。JUnit v4.11 の時点で、hamcrest はインライン化されなくなりました (IMHO の方がはるかに優れています)。そのため、マッチャーを使用する場合は、常に依存関係を明示的に追加する必要があります。
また、hamcrest コレクションのマッチングに関する有用なブログ投稿もここにあります。
編集:
私はあなたが何を返すかを考えようとしgetItems()
ましたが、ここに更新されたテスト例があります. 期待される値を配列に変換する必要があることに注意してください-なぜ、このコードが Hamcrest の hasItems コンパイルを使用しようとしないのですか? を参照してください。
@Test
public void bothValuesShouldBePresent() {
List lt1 = new ArrayList();
lt1.add(0);
lt1.add(1);
List lt2 = new ArrayList();
List fakeGetItems = new ArrayList() {{ add(new HashMap<String, Integer>() {{ put("item", 0); }}); add(new HashMap<String, Integer>() {{ put("item", 1); }} ); }};
for (Object a : fakeGetItems) {
HashMap b = (HashMap)a;
lt2.add(b.get("item"));
}
assertThat(lt2, hasItems(lt1.toArray(new Integer[lt1.size()])));
}