Why doesn't this code attempting to use Hamcrest's hasItems compile? Why doesn't this code attempting to use Hamcrest's hasItems compile? java java

Why doesn't this code attempting to use Hamcrest's hasItems compile?


Just ran into this post trying to fix it for myself. Gave me just enough information to work it out.

You can give the compiler just enough to persuade it to compile by casting the return value from hasItems to a (raw) Matcher, eg:

ArrayList<Integer> actual = new ArrayList<Integer>();ArrayList<Integer> expected = new ArrayList<Integer>();actual.add(1);expected.add(2);assertThat(actual, (Matcher) hasItems(expected));

Just in case anybody else is still suffering ...

Edit to add:In spite of the up votes, this answer is wrong, as Arend points out below. The correct answer is to turn the expected into an array of Integers, as hamcrest is expecting:

    ArrayList<Integer> actual = new ArrayList<Integer>();    ArrayList<Integer> expected = new ArrayList<Integer>();    actual.add(1);    expected.add(2);    assertThat(actual, hasItems(expected.toArray(new Integer[expected.size()])));


hasItems checks that a collection contains some items, not that 2 collections are equal, just use the normal equality assertions for that. So either assertEquals(a, b) or using assertThat

import static org.junit.Assert.assertThat;import static org.hamcrest.CoreMatchers.is;ArrayList<Integer> actual = new ArrayList<Integer>();ArrayList<Integer> expected = new ArrayList<Integer>();actual.add(1);expected.add(2);assertThat(actual, is(expected));

Alternatively, use the contains Matcher, which checks that an Iterable contains items in a specific order

import static org.junit.Assert.assertThat;import static org.hamcrest.Matchers.contains;ArrayList<Integer> actual = new ArrayList<Integer>();actual.add(1);actual.add(2);assertThat(actual, contains(1, 2)); // passesassertThat(actual, contains(3, 4)); // fails

If you don't care about the order use containsInAnyOrder instead.


You are comparing ArrayList<Integer> with int. The correct comparison is:

...assertThat(actual, hasItem(2));

-- Edit --

I'm sorry, I've read it wrong. Anyway, the signature of hasItems you want is:

public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... elements)

i.e., it accepts a variable number of arguments. I'm not sure if an ArrayList<T> is compatible, just guessing here. Try sending each item from the expected list interspersed by comma.

assertThat(actual, hasItems(2,4,1,5,6));

-- Edit 2 --

Just pasting here my comment, there is an equivalent expression for what you want, without using Hamcrest:

assertTrue(actual.containsAll(expected));