You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java测试中断言两个List对象相等失败,求排查解决方法

解决List断言失败的问题

看起来你遇到的问题是两个内容看起来完全一致的List,用Assert.assertEquals断言时却失败了,这其实是Java集合比较里的常见坑,根源出在你的Employee类上。

问题根源

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:52