I wanted to check that a collection is basically the same as another without knowing the collection type. I can only really check that the same elements are present, like a basic set.
The code below is based on the code here but with generics where possible (the matches method is not generic in EasyMock 2.5):
private static class CollectionMatcher<T> implements IArgumentMatcher {
private Collection<T> collection;
private String notFound = "";
public CollectionMatcher(Collection<T> collection) { this.collection = collection; }
public static <T> Collection<T> collectionEq(Collection<T> collection) {
reportMatcher(new CollectionMatcher<T>(collection));
return null;
}
public void appendTo(StringBuffer buffer) {
buffer.append(notFound).append(" not found in {");
String comma = "";
for (Object o : collection) {
buffer.append(comma).append(o.toString());
comma = ",";
}
buffer.append("}");
}
public boolean matches(Object otherCollection) {
if (!(otherCollection instanceof Collection)) return false;
Collection<T> other = (Collection<T>) otherCollection;
if (other.size() != collection.size()) return false; // Optionally check sizes
for (T o : other) {
if (!collection.contains(o)) {
notFound = o.toString();
return false;
}
}
return true;
}
}