JUnit 的 assertEquals 否定 assertTrue
JUnit's assertEquals denies assertTrue
假设我有自己的 class 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)));
它成功!
根据 assertEquals
为 class 调用 equals
方法(以确保我通过调试器自行检查了它并且确实如此)那么如何有可能 assertEquals
失败但 assetTrue
通过?!
您没有正确覆盖 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;
}
原因很简单:assertEquals
没有调用你自己写的equals
方法,因为它没有覆盖Object.equals(Object)
.
您的 equals
方法接受一个 Point
参数,这是一个完全不同的方法。您使用 assertTrue
的第二个测试只是直接调用该方法。