Hamcrest compare collections

hamcrest, java, junit

Solution

If you want to assert that the two lists are identical, don't complicate things with Hamcrest:

assertEquals(expectedList, actual.getList());

If you really intend to perform an order-insensitive comparison, you can call the `containsInAnyOrder` varargs method and provide values directly:

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(Assuming that your list is of `String`, rather than `Agent`, for this example.)

If you really want to call that same method with the contents of a `List`:

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

Without this, you're calling the method with a single argument and creating a `Matcher` that expects to match an `Iterable` where each element is a `List`. This can't be used to match a `List`.

That is, you can't match a `List<Agent>` with a `Matcher<Iterable<List<Agent>>`, which is what your code is attempting.

Problem

I'm trying to compare 2 lists: ``` assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList))); ``` But idea ``` java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>) method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable (no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>) method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable (cannot instantiate from arguments because actual and formal argument lists differ in length) ``` How should I write it?

Original source

Related problems