Hamcrest равняются наборам

Существует ли matcher в Hamcrest для сравнения наборов для равенства? Существует contains и containsInAnyOrder но мне нужно equals не связанный с конкретным типом набора. Например, Я не могу сравнить Arrays.asList и Map.values с Hamcrest equals.

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

11
задан Torsten 5 November 2015 в 12:13
поделиться

2 ответа

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

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

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

.
7
ответ дан 3 December 2019 в 09:20
поделиться

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

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

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));
    }
}
4
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: