Равные коллекции Hamcrest - PullRequest
11 голосов
/ 25 декабря 2009

Есть ли в Хэмкресте средство для сравнения коллекций на равенство?Есть contains и containsInAnyOrder, но мне нужно equals, не привязанное к конкретному типу коллекции.Например, я не могу сравнить Arrays.asList и Map.values ​​с Hamcrest equals.

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 25 декабря 2009

Я не могу сравнить Arrays.asList и Map.values ​​с Hamcrest равно.

Это из-за чрезмерно рьяных подписей Хэмкреста. Вы можете сделать это сравнение на равенство, но вам нужно привести объект List к Collection до его компиляции.

Мне часто приходится кастовать с Hamcrest, что кажется неправильным, но иногда это единственный способ заставить его скомпилироваться.

4 голосов
/ 08 января 2010

Приведение к Коллекции может работать, но оно делает некоторые предположения о базовых реализациях Коллекции (например, порядок?). Более общим подходом было бы написать свой собственный сопоставитель.

Вот почти полная реализация matcher, которая делает то, что вы хотите (вам нужно заполнить метод import и descriptionTo). Обратите внимание, что эта реализация требует, чтобы все элементы двух коллекций были равны, но не обязательно в том же порядке.

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));
    }
}
1 голос
/ 27 августа 2012

Если у вас возникли проблемы с методом equals в реализации коллекций, вы также можете сначала скопировать коллекции:

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

Также может работать следующее:

assertThat(actual, both(everyItem(isIn(expected))).and(containsInAnyOrder(expected)));
...