Kevin Pauli Kevin Pauli - 22 days ago 5
Java Question

How do I assert a List contains elements with a certain property?

Assume I want to unit test a method with this signature:

List<MyItem> getMyItems();


Assume MyItem is a pojo that has many properties, one of which is "name", accessed via getName().

All I care about verifying is that the List contains two MyItem instances, whose "name" properties have the values "foo" and "bar". If any other properties don't match, I don't really care for the purposes of this test. If the names match, it's a successful test.

I would like it to be one-liner if possible.. Here is some "pseudo-syntax" of the kind of thing I would like to do.

assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});


Would hamcrest be good for this type of thing? If so, what exactly would be the hamcrest version of my pseudo-syntax above?

Answer

Thank you @Razvan who pointed me in the right direction. I was able to get it in one line and I successfully hunted down the imports for Hamcrest 1.3.

the imports:

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;

the code:

assertThat( myClass.getMyItems(), contains(
    hasProperty("name", is("foo")), 
    hasProperty("name", is("bar"))
));