Search code examples
javajunithamcrest

Hamcrest compare collections


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?


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.