Map equality using Hamcrest

mo-seph picture mo-seph · Mar 24, 2010 · Viewed 35.6k times · Source

I'd like to use hamcrest to assert that two maps are equal, i.e. they have the same set of keys pointing to the same values.

My current best guess is:

assertThat( affA.entrySet(), hasItems( affB.entrySet() );

which gives:

The method assertThat(T, Matcher) in the type Assert is not applicable for the arguments (Set>, Matcher>>>)

I've also looked into variations of containsAll, and some others provided by the hamcrest packages. Can anyone point me in the right direction? Or do I have to write a custom matcher?

Answer

Hans-Peter Störr picture Hans-Peter Störr · Aug 27, 2012

The shortest way I've come up with is two statements:

assertThat( affA.entrySet(), everyItem(isIn(affB.entrySet())));
assertThat( affB.entrySet(), everyItem(isIn(affA.entrySet())));

But you can probably also do:

assertThat(affA.entrySet(), equalTo(affB.entrySet()));

depending on the implementations of the maps, and sacrificing the clarity of the difference report: that would just tell you that there is a difference, while the statement above would also tell you which one.

UPDATE: actually there is one statement that works independently of the collection types:

assertThat(affA.entrySet(), both(everyItem(isIn(affB.entrySet()))).and(containsInAnyOrder(affB.entrySet())));