コレクションの等価性を比較するための Hamcrest のマッチャーはありますか? ありますが、具体的なコレクション型にバインドする必要はcontains
ありません。たとえば、 Arrays.asList と Map.values を Hamcrest と比較することはできません。containsInAnyOrder
equals
equals
前もって感謝します!
コレクションの等価性を比較するための Hamcrest のマッチャーはありますか? ありますが、具体的なコレクション型にバインドする必要はcontains
ありません。たとえば、 Arrays.asList と Map.values を Hamcrest と比較することはできません。containsInAnyOrder
equals
equals
前もって感謝します!
Arrays.asList と Map.values を Hamcrest と比較することはできません。
これは、hamcrest の過度に熱心な型シグネチャによるものです。この等価比較を行うことはできList
ますが、オブジェクトをCollection
コンパイルする前にキャストする必要があります。
私は頻繁に Hamcrest でキャストしなければなりませんが、これは間違っていると感じますが、それが時々コンパイルできるようにする唯一の方法です。
コレクションへのキャストは機能する可能性がありますが、基礎となるコレクションの実装についていくつかの仮定があります(たとえば、順序?)。より一般的なアプローチは、独自のマッチャーを作成することです。
これは、必要なことを実行するほぼ完全なマッチャーの実装です(importsとdescribeToメソッドを入力する必要があります)。この実装では、2つのコレクションのすべての要素が等しい必要がありますが、必ずしも同じ順序である必要はありません。
public class IsCollectionOf<T> extends TypeSafeMatcher<Collection<T>> {
private final Collection<T> expected;
public IsCollectionOf(Collection<T> expected) {
this.expected = expected;
}
public boolean matchesSafely(Collection<T> given) {
List<T> tmp = new ArrayList<T>(expected);
for (T t : given) {
if (!tmp.remove(t)) {
return false;
}
return tmp.isEmpty();
}
// describeTo here
public static <T> Matcher<Collection<T>> ofItems(T... items) {
return new IsCollectionOf<T>(Arrays.asList(items));
}
}
コレクション実装の equals メソッドに問題がある場合は、最初にコレクションをコピーすることもできます。
assertThat( new ArrayList<Whatever>(actual), equalTo( new ArrayList<Whatever>(expected) );
また、以下が機能する可能性があります。
assertThat(actual, both(everyItem(isIn(expected))).and(containsInAnyOrder(expected)));