Равенство ArrayList в junit не работает, хотя ожидаемый и фактический похожи - PullRequest
0 голосов
/ 16 апреля 2020

Я использую метод теста ниже, чтобы проверить, отсортирован ли Arraylist, как ожидалось.

  @Test
  void compareFields()
  {
    Assignment14 assignment14 = new Assignment14();

    ArrayList<Person> PeopleList = new ArrayList<Person>();
    PeopleList.add(new Person("Alex",56));
    PeopleList.add(new Person("Thomas",23));
    PeopleList.add(new Person("John",10));

    ArrayList<Person> actualSortedResult = assignment14.compareFields(PeopleList);

    ArrayList<Person> expectedSortedResult = new ArrayList<Person>();
    expectedSortedResult.add(new Person("Alex",56));
    expectedSortedResult.add(new Person("John",10));
    expectedSortedResult.add(new Person("Thomas",23));

    Assert.assertEquals(expectedSortedResult, actualSortedResult);
  }

Но, несмотря на то, что ожидаемое и фактическое схожи, ошибки происходят как стипендиаты.

java.lang.AssertionError: expected: java.util.ArrayList<[Person{name='Alex', age=56}, Person{name='John', age=10}, Person{name='Thomas', age=23}]> but was: java.util.ArrayList<[Person{name='Alex', age=56}, Person{name='John', age=10}, Person{name='Thomas', age=23}]>
Expected :java.util.ArrayList<[Person{name='Alex', age=56}, Person{name='John', age=10}, Person{name='Thomas', age=23}]> 
Actual   :java.util.ArrayList<[Person{name='Alex', age=56}, Person{name='John', age=10}, Person{name='Thomas', age=23}]>
<Click to see difference>

Я пробовал следующие типы утверждений, но ничего не получалось.

   assertTrue("check equality", Arrays.equals(expectedSortedResult.toArray(), actualSortedResult.toArray()));
   Assert.assertEquals(expectedSortedResult, actualSortedResult);
   assertEquals(expectedSortedResult, actualSortedResult);
   assertTrue(expectedSortedResult.equals(actualSortedResult));
   assertArrayEquals(expectedSortedResult, actualSortedResult);

Могу ли я узнать, что не так с моим методом или что нужно сделать?

1 Ответ

3 голосов
/ 16 апреля 2020

ArrayList равный контракт сказал следующее: Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal.

Так что, глядя на свою ошибку, вы должны проверить контракт равного типа Person. Если вы не переопределяете равенства для этого типа, ссылки сравниваются, поэтому ваши списки не являются equals

. Поэтому вам придется переопределить equals метод, основанный на полях имени и возраста, чтобы решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...