I'm trying to write JUnit tests for some code that uses classes defined in Netscape's Lightweight Directory Access Protocol (LDAP) Software Development Kit (SDK) and I am having difficulties because the authors of several classes did not override equals.
For example, suppose I want to write a JUnit test for a method that returns an LDAPModificationSet. My first attempt is as follows:
public void testGetModifications() { final LDAPModificationSet expected = // some expected modifications final LDAPModificationSet actual = classUnderTest.methodUnderTest(); assertEquals(expected, actual); }
No matter how hard I try, this test will always fail. LDAPModificationSet does not override equals, so its equals method only returns true when passed the exact same instance.
Consider the alternatives for my test:
None of these alternatives are particularly fun.
The moral of this story: Override equals in value objects! The second moral of this story - buy "Effective Java: Second Edition" because Joshua Bloch already made this point in Item 8 when he wrote the book!