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

时间:2015-08-27 09:12:50

标签: java postgresql unit-testing

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

谢谢!

2 个答案:

答案 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中的方法,该方法仅检查两个对象是否指向相同的引用(内存中的相同地址)