11

コレクションの等価性を比較するための Hamcrest のマッチャーはありますか? ありますが、具体的なコレクション型にバインドする必要はcontainsありません。たとえば、 Arrays.asList と Map.values を Hamcrest と比較することはできません。containsInAnyOrderequalsequals

前もって感謝します!

4

3 に答える 3

7

Arrays.asList と Map.values を Hamcrest と比較することはできません。

これは、hamcrest の過度に熱心な型シグネチャによるものです。この等価比較を行うことはできListますが、オブジェクトをCollectionコンパイルする前にキャストする必要があります。

私は頻繁に Hamcrest でキャストしなければなりませんが、これは間違っていると感じますが、それが時々コンパイルできるようにする唯一の方法です。

于 2009-12-25T11:32:40.573 に答える
4

コレクションへのキャストは機能する可能性がありますが、基礎となるコレクションの実装についていくつかの仮定があります(たとえば、順序?)。より一般的なアプローチは、独自のマッチャーを作成することです。

これは、必要なことを実行するほぼ完全なマッチャーの実装です(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));
    }
}
于 2010-01-08T13:41:05.307 に答える
1

コレクション実装の equals メソッドに問題がある場合は、最初にコレクションをコピーすることもできます。

assertThat( new ArrayList<Whatever>(actual), equalTo( new ArrayList<Whatever>(expected) );

また、以下が機能する可能性があります。

assertThat(actual, both(everyItem(isIn(expected))).and(containsInAnyOrder(expected)));
于 2012-08-27T15:54:13.730 に答える