I have a list of Integers (current) and I want to check whether this list contains all elements from list expected and not even one element from list notExpected, so code looks like:
List<Integer> expected= new ArrayList<Integer>();
expected.add(1);
expected.add(2);
List<Integer> notExpected = new ArrayList<Integer>();
notExpected.add(3);
notExpected.add(4);
List<Integer> current = new ArrayList<Integer>();
current.add(1);
current.add(2);
assertThat(current, not(hasItems(notExpected.toArray(new Integer[expected.size()]))));
assertThat(current, (hasItems(expected.toArray(new Integer[expected.size()]))));
So long so good. But when I add
current.add(3);
the test is also green. Do I misused the hamcrest matcher? Btw.
for (Integer i : notExpected)
assertThat(current, not(hasItem(i)));
gives me the correct answer, but I thought that I just can easily use the hamcrest matcher for that. I'm using junit 4.11 and hamcrest 1.3
hasItems(notExpected...)
would only match current
if all elements from notExpected
were also in current
. So with the line
assertThat(current, not(hasItems(notExpected...)));
you assert that current
doesn't contain all elements from notExpected
.
One solution to assert that current
doesn't contain any elements from notExpected
:
assertThat(current, everyItem(not(isIn(notExpected))));
and then you don't even have to convert the list to array. This variant maybe a bit more readable, but requires conversion to array:
assertThat(current, everyItem(not(isOneOf(notExpected...))));
Note that these matchers are not from CoreMatchers
in hamcrest-core
, so you will need to add a dependency on hamcrest-library
.
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
</dependency>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With