Java JUnit';s assertEquals否认assertTrue

Java JUnit';s assertEquals否认assertTrue,java,junit,double,point,Java,Junit,Double,Point,假设我有自己的类点和双X,双Y public class Point { private final double x; private final double y; public Point(double x, double y) { this.x = x; this.y = y; } public boolean equals(Point point){ return x == point.x &

假设我有自己的类
双X,双Y

public class Point {

    private final double x;
    private final double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public boolean equals(Point point){
        return x == point.x && y == point.y;
    }
}
我也为它写了一个测试

    assertEquals(new Point(0.0, 5.0), new Point(0.0, 5.0));
你猜怎么着失败。我确信这是一个双重比较,除非我试过:

assertTrue(new Point(0.0, 5.0).equals(new Point(0.0, 5.0)));
而且它成功了


根据类的
assertEquals
调用
equals
方法(以确保我自己通过调试器检查了它,并且确实检查了),那么
assertEquals
失败但
assetTrue
通过的可能性如何

您没有正确重写
对象#equals()
方法——其签名应如下所示:

public boolean equals(Object obj) {
参数的类型必须为
对象
,然后将其转换为

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Point other = (Point) obj;
    return x == other.x && y == other.y;
}

您没有正确重写
对象#equals()
方法——其签名应如下所示:

public boolean equals(Object obj) {
参数的类型必须为
对象
,然后将其转换为

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Point other = (Point) obj;
    return x == other.x && y == other.y;
}

原因很简单:
assertEquals
不会调用您自己编写的
equals
方法,因为它不会重写
Object.equals(Object)


您的
equals
方法接受一个
参数,这是一个完全不同的方法。使用
assertTrue
的第二个测试只需直接调用该方法。

原因很简单:
assertEquals
不会调用您自己编写的
equals
方法,因为它不会覆盖
Object.equals(Object)


您的
equals
方法接受一个
参数,这是一个完全不同的方法。使用
assertTrue
的第二个测试只需直接调用该方法。

@Filip这就是当您认为正在重写某个方法时应使用
@Override
的原因。编译器会抱怨你的原始代码。这是否意味着
assertEquals(新点(0.0,5.0),新点(0.0,5.0))不要调用
点。等于
但是
Object.equals()
?@FilipBartuzi Yes它调用(重写)
Object.equals()
,该对象以
Object
为参数。问题中最初的
Point.equals()
完全不同,因此没有被断言调用。使用“super”代替3个“if语句”@Filip怎么样?这就是为什么当您认为正在重写方法时,应该使用
@Override
。编译器会抱怨你的原始代码。这是否意味着
assertEquals(新点(0.0,5.0),新点(0.0,5.0))不要调用
点。等于
但是
Object.equals()
?@FilipBartuzi Yes它调用(重写)
Object.equals()
,该对象以
Object
为参数。问题中最初的
Point.equals()
是完全不同的,因此没有被断言调用。如果两个答案都正确,用“super”代替“3”怎么样。对您的一点额外帮助:如果您打算重写一个方法,请使用
@override
对其进行注释(现代IDE会自动为您完成这项工作,请查找它)。然后,编译器能够检测该方法是否确实重写了一个方法。在您的情况下,编译器会检测到错误。两个答案都是正确的。对您的一点额外帮助:如果您打算重写一个方法,请使用
@override
对其进行注释(现代IDE会自动为您完成这项工作,请查找它)。然后,编译器能够检测该方法是否确实重写了一个方法。在您的情况下,编译器会检测到错误。