JUnit的assertEquals拒绝assertTrue

时间:2015-03-09 12:06:46

标签: java junit double point

假设我自己的班级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)));

SUCCED

根据https://stackoverflow.com/a/13607662/2047418 assertEquals调用类equals方法(确保我自己通过调试器检查它,确实是这样)所以{{1}怎么可能失败,但assertEquals通过?!

2 个答案:

答案 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进行的第二次测试只是直接调用该方法。