Java测试中断言两个List对象相等失败,求排查解决方法
解决List断言失败的问题
看起来你遇到的问题是两个内容看起来完全一致的ListEmployee类上。
问题根源
Assert.assertEquals比较两个List时,会遍历两个集合的元素,逐个调用元素的equals()方法判断是否相等。但如果你的Employee类没有重写equals()和hashCode()方法,默认会使用Object类的实现——也就是比较对象的内存地址,而不是对象的属性值。
简单来说:你手动new的Employee实例,和Gson从JSON反序列化出来的Employee实例,虽然属性完全一样,但它们是内存里的两个不同对象,默认的equals()会判定它们不相等,最终导致整个List的断言失败。
解决方案
你需要给Employee类重写equals()和hashCode()方法,基于对象的核心属性(比如id、姓名等)来判断两个对象是否相等。
方式1:手动重写
示例代码如下(基于Employee的所有属性实现):
import java.util.Objects; public class Employee { private int id; private String firstName; private String lastName; private int age; private boolean active; // 构造函数、getter、setter省略 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Employee employee = (Employee) o; return id == employee.id && age == employee.age && active == employee.active && Objects.equals(firstName, employee.firstName) && Objects.equals(lastName, employee.lastName); } @Override public int hashCode() { return Objects.hash(id, firstName, lastName, age, active); } }
方式2:用Lombok简化
如果你的项目已经引入了Lombok,可以直接给Employee类加上@EqualsAndHashCode注解,它会自动帮你生成基于所有非静态属性的equals和hashCode方法,省去手动编写的麻烦:
import lombok.EqualsAndHashCode; @EqualsAndHashCode public class Employee { private int id; private String firstName; private String lastName; private int age; private boolean active; // 构造函数、getter、setter省略 }
验证
完成重写后,再运行你的测试用例,Assert.assertEquals(actualList, expectedList)就会正确比较两个List的内容是否一致,而不是比较对象的内存引用啦。
内容的提问来源于stack exchange,提问作者nhxkutex
相关产品推荐
相关产品推荐

