hasProperty, the Hidden Gem of Hamcrest (and assertThat)
Posted by Jakub Holý on October 15, 2011
If you got used to JUnit 4′s
assertThat with various matchers (of course you will need junit-dep.jar and hamcrest.jar to get the full set instead of the small subset integrated in junit.jar), make sure you don’t overlook the matcher hasProperty. It is very useful if you have non-trivial objects and cannot use some more flexible language like Groovy for your unit tests.
The advantage of
hasProperty is that it allows you to check a particular property (or more properties with
allOf) of an object while ignoring the others – pretty useful if the object has 20 properties and checking just one is enough for you. (Admittedly, an object with 20 properties is an abomination but hey, that’s the real legacy word!)
Example – check that collection contains two Images with some file names:
assertThat("Expected images", (Iterable<Object>) hotel.getImages() , containsInAnyOrder(hasProperty("filename", is("radisson1.jpg")) , hasProperty("filename", is("radisson2.jpg"))));
The failure message in this case isn’t as clear as I might wish but still this is the best solution I can think of.