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

Cra*_*lus 2 java collections junit unit-testing list

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

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
}  
Run Code Online (Sandbox Code Playgroud)

我有各种各样的人,我想按年龄排序:

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;
            }

        });   
Run Code Online (Sandbox Code Playgroud)

现在我想测试它是否已正确排序,因此我有一个JUnit测试用例,其中包含以下内容:

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

测试用例通过.所以它是排序的.
但我不明白这一点.该assertEquals会使用比较2所列出List.equals它调用equals 每个包含的对象上.
问题是我没有equals在课堂上覆盖Person.
结果是以下失败:

Person p22 = new Person("George", 22, 12, 180);   
Person p22_2 = new Person("George", 22, 12, 180);    
assertEquals(p22, p22_2);  
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 7

在第一个示例中,您不是在创建对象 - 您正在比较对同一对象的引用.这是有效的,因为默认实现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
Run Code Online (Sandbox Code Playgroud)

  • @ user384706:`我应该......创建新列表`.它与列表无关.列表覆盖等于.`我应该在Person中覆盖equals'这取决于你是否想要两个具有相同值的对象进行比较相等.通常你想要(但不总是).`我应该将测试用例视为通过吗?如果您正在测试排序 - 是的,它可以工作.如果你想测试`equals`以你想要的方式工作,那么为它编写一个新的测试.每次测试只测试一件事. (2认同)