gpt4 book ai didi

java - 为什么 .equals() 在比较两个对象时会导致断言错误……但只是有时?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:53 25 4
gpt4 key购买 nike

我正在为代码学校的一个项目进行单元测试,.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 中的两个值是否“.equal” 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() 可以比较某些对象而不能比较其他对象?在我的代码示例中,我看到的唯一区别是一个对象采用一个参数,而另一个采用两个参数。

谢谢!

最佳答案

默认情况下,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;
}
}
}

关于java - 为什么 .equals() 在比较两个对象时会导致断言错误……但只是有时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32245200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com