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会自动为您完成这项工作,请查找它)。然后,编译器能够检测该方法是否确实重写了一个方法。在您的情况下,编译器会检测到错误。