为什么 assertEquals 和 assertSame in junit 在 junit 中为两个实例同一类返回相同的结果?

2022-09-01 07:24:04

根据文档

assertEquals() 断言两个对象相等。

assertSame() 断言两个对象引用同一个对象。

所以我期待如果我有一个像下面这样的课程

class SomeClass {}

然后

SomeClass someClass1= new SomeClass();
SomeClass someClass2= new SomeClass();
assertSame(someClass1,someClass2); // fail
assertEquals(someClass1,someClass2); // fail

assertEquals 应该通过,assertSame 应该失败,因为两个类的值相等,但它们具有不同的引用位置。

由于我在这两种情况下都失败了,所以我的问题是这两者有什么区别?


答案 1

由于您没有重写类中的 equals,因此 其行为与默认 equals 实现比较引用的行为相同。assertEqualsassertSame

150    public boolean equals(Object obj) {
151        return (this == obj);
152    }

如果您提供相等的愚蠢覆盖:

class SomeClass {
    @Override 
    public boolean equals(Object o) {
        return true;
    }
}

你会看到成功。assertEquals


答案 2

assertEquals使用方法(应在类中重写该方法以真正比较其实例)来比较对象,同时使用运算符来比较它们。因此,差异与(按值比较)和(比较标识)之间的差异完全相同。equals()assertSame====equals


推荐