当我遇到这个小问题时,我最近偶然发现Lombok
,并想对其进行测试。
假设我有
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Name extends AbstractName {
@NonNull
private String firstname;
@NonNull
private String lastname;
}
其中AbstractName
是一个空的抽象类。我想用{p>
equals
如您所见,我希望@Test
public void testEquals() {
Name instance1 = new Name("Vorname","Nachname");
Name instance2 = new Name("Vorname","Nachname");
boolean expResult = true;
boolean result = instance1.equals(instance2);
assertEquals(expResult, result);
}
的两个实例相等。如果您添加
Name
一个得到
System.out.println(instance1.getFirstname().equals(instance2.getFirstname()));
System.out.println(instance1.getLastname().equals(instance2.getLastname()));
那么,为什么测试失败?是由于true
true
的继承而引起的hashCode()
问题吗?我该如何解决?
顺便说一句,如果AbstractName
是独立类而不是Name
的子类,它不会失败。
这是由AbstractName
Lombok
答案 0 :(得分:2)
使用@Data是包含@EqualsAndHashCode的捷径。尝试显式添加@EqualsAndHashCode并将callSuper
设置为false。
但是,对于长期维护而言,在基类中重写equals / hashCode并返回true / 0或将@EqualsAndHashCode应用于基类可能更安全。