我正在为代码学校的项目进行单元测试,.equals()
给我带来了一些麻烦。在我的项目中,.save()
正在保存到SQL数据库中。此代码通过了单元测试:
@Test
public void save_assignsNameToObject() {
Restaurant testRestaurant = new Restaurant("PokPok","503-444-4444");
testRestaurant.save();
Restaurant savedRestaurant = Restaurant.all.get(0);
assertEquals(savedRestaurant.getName(), "PokPok");
}
但如果我将最后一行更改为以下内容,则会导致断言错误:
assertTrue(savedRestaurant.equals(testRestaurant));
我使用System.out.println()
进行了调试,以验证testRestaurant
中的两个值是否为“。{等于”savedRestaurant
中的相应值。以下单元测试(对于另一个非常相似的类的对象)使用.equals()
方法传递:
@Test
public void save_assignsIdToObject_true() {
Cuisine testCuisine = new Cuisine("Mexican");
testCuisine.save();
Cuisine savedCuisine = Cuisine.all().get(0);
assertTrue(savedCuisine.equals(testCuisine));
}
编辑:这是我.equals()
的源代码:
@Override
public boolean equals(Object otherRestaurant) {
if (!(otherRestaurant instanceof Restaurant)) {
return false;
} else {
Restaurant newRestaurant = (Restaurant) otherRestaurant;
return this.getId() == new Restaurant.getId() &&
this.getName().equals(newRestaurant.getName()) &&
...
this.getPhone().equals(newRestaurant.getPhone());
}
}
为什么.equals()
可以比较某些对象而不是其他对象?在我的代码示例中,我看到的唯一区别是一个对象接受一个参数,另一个接受两个参数。
谢谢!
答案 0 :(得分:3)
默认情况下,java对象上的equals()
检查它们是完全相同的对象(而不是具有相同值的两个对象)。 http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals%28java.lang.Object%29
String对象会覆盖equals()
,以便为具有相同值的两个不同对象返回true,但您的自定义Restaurant
类不会。
您可以定义自定义equals()
,例如
public class Restaurant {
private String name;
private String tel;
public Restaurant(String name, String tel) {
this.name = name;
this.tel = tel;
}
/*getters and setters*/
override public boolean equals(Object obj) {
if(obj instanceOf Restaurant) {
Restaurant that = (Restaurant) obj;
return (this.name.equals(that.getName()) && this.tel.equals(that.getTel()));
} else {
return false;
}
}
}
答案 1 :(得分:1)
您需要覆盖 Restaurant 类中 equals 的实现,才能正确使用它来比较该类的对象
默认等于比较将引导您进入 Object Class中的方法,该方法仅检查两个对象是否指向相同的引用(内存中的相同地址)