比较JUnit中的列表。它成功但我没有覆盖平等。它是如何工作的?

时间:2012-05-06 07:59:57

标签: java unit-testing list collections junit

我有一个包含原始字段的类,如下所示:

public class Person{  
  String name;  
  int age;  
  int id;  
  int height;  
  public Person(String name, int age, int id, int height){  
      this.name = name;
      this.age = age;  
      this.id = id;  
      this.height = height;  
  } 
  //other methods
}  

我有各种各样的人,我想按年龄分类:

Person p87 = new Person("John", 87, 123, 185);  
Person p22 = new Person("George", 22, 12, 180);  
//etc  ....for other persons. Then I create a list of them
List<Person> persons= Arrays.asList(p87, p22, p45, p31, p55, p62 );  
Collections.sort(persons, new Comparator<Person>() {

            @Override
            public int compare(Person p1, person p2) {
                return p1.age - p2.age;
            }

        });   

现在我想测试它是否已经正确排序,所以我有一个带有以下内容的JUnit测试用例:

assertEquals(Arrays.asList(p22, p31, p45, p55, p62, p87 ), persons);

测试用例通过。所以它是分类的。
但我不明白这一点。 assertEquals会使用List.equals比较2个列表,{{3}}会在每个包含的对象上调用equals
问题是我没有覆盖班级equals中的Person 因此,以下失败

Person p22 = new Person("George", 22, 12, 180);   
Person p22_2 = new Person("George", 22, 12, 180);    
assertEquals(p22, p22_2);  

我不明白这一点。为什么在测试用例中2列表相同?

1 个答案:

答案 0 :(得分:7)

在第一个示例中,您没有创建 new 对象 - 您正在比较对相同对象的引用。这是有效的,因为equals的默认实现是比较引用相等性。

你正在做与此相同的事情:

Person p22 = new Person("George", 22, 12, 180);   
Person p22_2 = p22;
assertEquals(p22, p22_2);   // works, because both refer to the same object