web-dev-qa-db-ja.com

jUnitのCollectionAssert?

NUnitの CollectionAssert と並行するjUnitがありますか?

79
ripper234

JUnit 4.4を使用すると、assertThat()Hamcrest コードと一緒に使用できます(心配する必要はありません。JUnitに同梱されています。追加の.jar)コレクションを操作するものを含む、複雑な自己記述的なアサートを生成します。

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

このアプローチを使用すると、失敗したときにアサートの適切な説明を自動的に取得します。

120
Joachim Sauer

直接ではありません Hamcrest を使用することをお勧めします。これは、jUnit(および他のテストフレームワーク)とうまく統合される豊富なマッチングルールセットを提供します。

4
skaffman

FEST Fluent Assertionsをご覧ください。私見では、Hamcrest(および同等に強力、拡張可能など)よりも使いやすく、流=なインターフェースのおかげでIDEのサポートが向上しています。 https://github.com/alexruiz /fest-assert-2.x/wiki/Using-fest-assertions

2

Joachim Sauerのソリューションは素晴らしいですが、結果にあることを確認したい期待の配列が既にある場合は機能しません。これは、結果を比較したいテストで既に生成された期待値または一定の期待値がある場合、または結果にマージされる期待値が複数ある場合に発生する可能性があります。したがって、マッチャーを使用する代わりに、単にList::containsAllおよびassertTrue例:

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}
2
gavs