You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JUnit断言失败:预期与结果内容一致却报错

问题排查与解决办法

嘿,我一眼就发现问题出在哪了!虽然日志里显示两个ArrayList的内容完全一致,但JUnit的assertEquals还是失败,核心原因是你的**RedditThing类没有正确重写equals()hashCode()方法**。

为什么会出现这种情况?

  • 当用assertEquals比较两个ArrayList时,JUnit会逐个检查集合里的元素是否“相等”。
  • Java默认的Object.equals()方法是比较对象的内存引用,而不是对象的内容。也就是说,哪怕两个RedditThing的id、内容、作者都一模一样,只要它们是不同的实例,默认的equals()就会返回false,导致集合对比失败。
  • 至于空值测试能通过,是因为空集合里没有元素需要做equals校验呀。

怎么修复?

你需要在RedditThing类里重写equals()hashCode(),基于对象的属性来判断相等性。给你一个示例实现:

import java.util.Objects;

public class RedditThing {
    private String id;
    private String content;
    private String author;

    // 你的构造函数、getter/setter等代码

    @Override
    public boolean equals(Object o) {
        // 先判断是不是同一个对象引用
        if (this == o) return true;
        // 判空或者类型不匹配直接返回false
        if (o == null || getClass() != o.getClass()) return false;
        // 强转后对比所有关键属性
        RedditThing that = (RedditThing) o;
        return Objects.equals(id, that.id) &&
               Objects.equals(content, that.content) &&
               Objects.equals(author, that.author);
    }

    @Override
    public int hashCode() {
        // 用所有关键属性生成哈希值
        return Objects.hash(id, content, author);
    }
}

额外提醒

  • 按照Java的规范,重写equals()的时候必须同步重写hashCode(),这是为了保证对象在HashSet、HashMap这类哈希集合中能正常工作,也符合equals和hashCode的契约(如果两个对象equals返回true,它们的hashCode必须相等)。
  • java.util.Objects的工具方法可以帮你避免空指针问题,写起来也更简洁。

修改完RedditThing类后,再跑你的测试,assertEquals(expResult, result)就能正确对比两个集合里的对象内容,而不是对比内存引用啦!

内容的提问来源于stack exchange,提问作者Julia Dune

火山引擎 最新活动