假设我自己的班级Point
加double X, double 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)));
它 SUCCED !
根据https://stackoverflow.com/a/13607662/2047418 assertEquals
调用类equals
方法(确保我自己通过调试器检查它,确实是这样)所以{{1}怎么可能失败,但assertEquals
通过?!
答案 0 :(得分:6)
您未正确覆盖Object#equals()
方法 - 其签名应如下所示:
public boolean equals(Object obj) {
参数必须是Object
类型,然后您可以将其转换为Point
:
@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;
}
答案 1 :(得分:2)
原因很简单:assertEquals
不会调用您自己编写的equals
方法,因为它不会覆盖Object.equals(Object)
。
您的equals
方法接受Point
参数,这是一种完全不同的方法。使用assertTrue
进行的第二次测试只是直接调用该方法。