JUnit 的 assertEquals 否定 assertTrue

JUnit's assertEquals denies assertTrue

假设我有自己的 class Pointdouble 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 的第二个测试只是直接调用该方法。