Существует ли matcher в Hamcrest для сравнения наборов для равенства? Существует contains
и containsInAnyOrder
но мне нужно equals
не связанный с конкретным типом набора. Например, Я не могу сравнить Arrays.asList и Map.values с Hamcrest equals
.
Заранее спасибо!
Я не могу сравнивать Arrays.asList и Значения Map.values с Hamcrest равны.
Это связано с чрезмерно усердными сигнатурами типа Hamcrest. Вы можете сделать это сравнение равенства, но вам нужно привести объект List
в Collection
, прежде чем он скомпилируется.
Мне часто приходится делать кастинг с Hamcrest, что кажется неправильным, но иногда это единственный способ заставить его скомпилироваться.
.Литье в коллекцию может работать, но он делает некоторые предположения о базовых реализациях сбора (например, заказ?). Более общий подход будет написать свой собственный сопоставитель.
Вот почти полная реализация сопоставлений, которая выполняет то, что вы хотите (вам нужно заполнить метод импорта и описания). Обратите внимание, что эта реализация требует, чтобы все элементы двух коллекций равны, но не обязательно в том же порядке.
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));
}
}