回答:
2つSet
のが互いに等しいことをアサートすると、Set
equals()
メソッドが呼び出されます。
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
@Test
2つSet
のが同じサイズで、同じ要素を含む場合、これは成功します。
equals
とhashCode
、あなたのHashtableに保存していることをクラスで実装されましたか?
アパッチコモンズが再び救助に。
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
魅力のように機能します。なぜなのかはわかりませんが、コレクションでは次のassertEquals(coll1, coll2)
ことが常に機能するとは限りません。私にとって失敗した場合、私はセットに支えられた2つのコレクションを持っていました。hamcrestもjunitも、コレクションが等しいと確信していたとしても、コレクションが等しいとは言いません。CollectionUtilsを使用すると、完全に機能します。
特に興味深いケースは、
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
そして
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
これまでのところ、私が見る唯一の解決策は、両方をセットに変更することです
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
または、要素ごとに比較することもできます。
配列ベースの追加の方法として、junitxで順序なし配列アサーションを使用することを検討できます。Apache CollectionUtilsの例は機能しますが、そこにも固体アサーション拡張機能のパッケージがあります。
と思う
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
アプローチははるかに読みやすく、デバッグ可能です(すべてのコレクションがtoArray()をサポートしているため、ArrayAssertメソッドを使用するのは簡単です。
もちろん、ここでの欠点は、junitxが追加のjarファイルまたはmavenエントリであることです...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Hamcrestの使用:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
これは、セットのデータ型が異なる場合にも機能し、単に失敗するのではなく、その違いについて報告します。
(既存のコレクションと比較するのではなく)リストまたはセットに特定の値のセットが含まれているかどうかを確認する場合は、コレクションのtoStringメソッドが便利です。
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
これは、最初に予想されるコレクションを作成して実際のコレクションと比較するよりも少し短く、記述および修正が簡単です。
(確かに、これは特にクリーンな方法ではなく、要素「foo、bar」を2つの要素「foo」と「bar」から区別することはできません。しかし、実際には、テストを書くのが簡単で高速であることが最も重要だと思います、そうでなければ、多くの開発者は押されることなくしてはなりません。)
Hans-PeterStörrの解が好きです...しかし、私はそれがまったく正しくないと思います。悲しいcontainsInAnyOrder
ことに、Collection
比較対象のオブジェクトを受け入れません。だからそれはCollection
のMatcher
s でなければなりません:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
インポートは次のとおりです。
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;