jUnitのCollectionAssert?


回答:


125

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"))));

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


1
ああ、私はハムクレストがそれをjunitディストリビューションにしたことに気づいていませんでした。ナットに行く!
skaffman 2009

lがアイテム( "foo"、 "bar")で構成されていると主張したいが、他のアイテムが存在しない場合-そのための簡単な構文はありますか?
ripper234 2009

上記のコードスニペットを使用して、追加のassertTrue(l.size()== 2)
aberrant80

4
まあ、醜い。NUnitでは、CollectionAssert.AreEqual(コレクションが期待され、コレクションが実際に);
ripper234 2009

1
Googleは私が探していた別のStackoverflowの答えを見つけました!
Mykola Golubyev 2009

4

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


これは何らかの理由でコンパイルされません(stackoverflow.com/questions/1092981/hamcrests-hasitemsを参照):ArrayList <Integer> actual = new ArrayList <Integer>(); ArrayList <整数>が必要= new ArrayList <整数>(); actual.add(1); expected.add(2); assertThat(actual、hasItems(expected));
ripper234 2009


2

Joachim Sauerのソリューションは優れていますが、検証したい一連の期待が結果に含まれている場合は機能しません。これは、結果を比較したいテストで生成された、または一定の期待値がすでにある場合、または結果にマージされることを期待する複数の期待値がある場合に発生する可能性があります。だからではなく、あなただけ使うことができマッチャを使用したのList::containsAllassertTrue例の場合:

@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
}

いつでも使用できますhasItems(expected1.toArray(new String[expected1.size()]))。それはあなたにより良い失敗メッセージを与えるでしょう。
meustrus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.