Test na equals, hashCode a compareTo

Potřeboval jsem otestovat správnost metod equals, hashCode a zejména compareTo, protože jsem si nebyl jist, jestli implementace pro životně důležitou třídu v projektu, na kterém pracuji, bude bez chyb. Je pátek, venku sluníčko, to by nemuselo dopadnout dobře. Z literatury vím, že metoda compareTo musí splňovat jisté podmínky, aby byla zajištěna správnost. Také musejí být implementovány (správně) metody equals a hashCode. Proto mě napadlo – co takhle si napsat nějaký obecný test, který by správnost implementací kontroloval. Mohl bych ho pak používat znovu a znovu! A pak mě napadlo – neřešil už tohle někdo?

Ano, řešil. Knihovna JUnit Addons obsahuje třídy ComparabilityTestCase a EqualsHashCodeTestCase, které dělají přesně to, co je potřeba. Ověří dané podmínky, které jsou definovány v dokumentačních kontraktech těchto metod. Pakliže jsou porušeny, koledujeme si totiž o veliký malér. Ukázka:

// bacha jen Java 1.5+
public class FileHolderCompareTest extends ComparabilityTestCase {
 
	public FileHolderCompareTest(String s) {
		super(s);
	}
 
	protected Comparable createLessInstance() throws Exception {
		return -1;
	}
 
	protected Comparable createEqualInstance() throws Exception {
		return 0;
	}
 
	protected Comparable createGreaterInstance() throws Exception {
		return 1;
	}
}