Assertions with assertThat
I like to think I’m reasonably up-to-date with Java technologies but then I discovered something today that shows up that I’m still ignorant of a lot of available technology that’s out there. Today I ran across hamcrest which is now apparently part of junit 4.4 and above.
Basically it replaces the old assertEquals() & variants with an assertThat statement. ie:
assertThat([value], [matcher statement]);
Some examples:
assertThat(x, is(3));
assertThat(x, is(not(4)));
assertThat(responseString, either(containsString("color")).or(containsString("colour")));
assertThat(myList, hasItem("3"));
Basically all sorts of matchers are possible. The advantages here are improved failure reporting and a clearer expression of intent.
There’s some other interesting stuff built around this too – such as hamcrest collections. Take a look at this:
smiths = select(people, where(Person.class).getLastName(), equalToIgnoringCase("smith"));
Looks like good stuff to play around with over the next few days.
Comments are closed.
I don’t perceive the claimed readability improvement. Could someone please clarify?
When I get a failed test I don’t look for an error message, I go directly to the failing line, and I think the failed condition is obvious. Adding an error message is not worth learning another comparison language imho.
Well keep in mind I haven’t used this yet but when you do checks such as
assertTrue( actual < 20 )
you don't see what the value of 'actual' is – just that it failed. Sure you could fire up a debugger and rerun your test but this is a nice little bit of extra information.
Now it could be that this still doesn't make the use of matchers worthwhile but I'll find that out after I play around a bit more. I'd be interested to hear from anyone who'd had some experience trying to use this (negative or positive).