equals
와 hashCode
메소드는 일반적으로 자동 생성하는 방식을 사용하는데 Java Code Coverage에서 매우 많은 커버리지를 깎아먹는 부분이다. 이에 equals
와 hashCode
에 대해 자동 테스트를 하여 커버리지를 높여주는 역할을 한다.EqualsVerifier
이지만 hashCode
까지 처리한다.EqualsVerifierExample
이라는 Lombok @Data
애노테이션이 적용된 클래스가 있을 때@Test public void equalsAndHashCodeContract() throws Exception { class SubEqualsVerifierExample extends EqualsVerifierExample { @Override public boolean canEqual(Object obj) { return false; } } EqualsVerifier.forClass(EqualsVerifierExample.class) .suppress(Warning.NULL_FIELDS, Warning.NONFINAL_FIELDS) .withRedefinedSubclass(SubEqualsVerifierExample.class) .verify(); }
suppress
부분을 제거하고 해본다.class Sub$CLASS$ extends $CLASS$ { @Override public boolean canEqual(Object obj) { return false; } } EqualsVerifier.forClass($CLASS$.class) .suppress(Warning.NULL_FIELDS, Warning.NONFINAL_FIELDS) .withRedefinedSubclass(Sub$CLASS$.class) .verify();
static class Sub$CLASS$ extends $CLASS$ { @Override boolean canEqual(Object obj) { return false } } def "equalsAndHashCode verify"() { expect: EqualsVerifier.forClass($CLASS$.class) .suppress(nl.jqno.equalsverifier.Warning.NONFINAL_FIELDS, nl.jqno.equalsverifier.Warning.ALL_FIELDS_SHOULD_BE_USED) .withRedefinedSubclass(Sub$CLASS$.class) .withRedefinedSuperclass() .verify() }