AssertionError в ArrayList с тем же выводом

Я знаю, что эту тему задавали много раз, и я ищу все возможные решения, но, к сожалению, мою проблему ничто не решает.

Вот мой тестовый пример:

@Test
    public void whenFindAllBy_thenReturnListofViewPlanDetailDto() {
        java.sql.Date startDate = new java.sql.Date(new Date().getTime());
        java.sql.Date endDate = new java.sql.Date(new Date().getTime());
        Plan planA = new Plan();
        planA.setName("Plan A - 2018");
        entityManager.persist(planA);
        entityManager.flush();
        Module moduleA = new Module();
        moduleA.setName("CSS");
        moduleA.setDescription("CSS is a cornerstone technology of the World Wide Web, alongside HTML and JavaScript.");
        entityManager.persist(moduleA);

        Module moduleB = new Module();
        moduleB.setName("HTML");
        moduleB.setDescription("Hypertext Markup Language is the standard markup language for creating web pages and web applications.");
        entityManager.persist(moduleB);

        PlanDetail planDetailA = new PlanDetail();
        planDetailA.setInstructor("Mozilla Firefox Foundation");
        planDetailA.setStartDate(startDate);
        planDetailA.setEndDate(endDate);
        planDetailA.setModule(moduleA);
        planDetailA.setPlan(planA);
        entityManager.persist(planDetailA);


        PlanDetail planDetailB = new PlanDetail();
        planDetailB.setInstructor("W3 Schools");
        planDetailB.setStartDate(startDate);
        planDetailB.setEndDate(endDate);
        planDetailB.setModule(moduleB);
        planDetailB.setPlan(planA);
        entityManager.persist(planDetailB);

        entityManager.flush();

        List<ViewPlanDetailDto> plandetails = new ArrayList<>();
        plandetails.add(new ViewPlanDetailDto(planDetailA.getId(), planDetailA.getModule().getName(), planDetailA.getModule().getDescription(), planDetailA.getInstructor(), planDetailA.getStartDate(), planDetailA.getEndDate()));
        plandetails.add(new ViewPlanDetailDto(planDetailB.getId(), planDetailB.getModule().getName(), planDetailB.getModule().getDescription(), planDetailB.getInstructor(), planDetailB.getStartDate(), planDetailB.getEndDate()));

        assertEquals(planRepository.findAllBy(planA.getId()), plandetails);

    }

Трассировки стека:

java.lang.AssertionError: expected: java.util.ArrayList<[ViewPlanDetailDto(detailId=1, name=CSS, description=CSS is a cornerstone technology of the World Wide Web, alongside HTML and JavaScript., instructor=Mozilla Firefox Foundation, startDate=2018-07-06, endDate=2018-07-06), ViewPlanDetailDto(detailId=2, name=HTML, description=Hypertext Markup Language is the standard markup language for creating web pages and web applications., instructor=W3 Schools, startDate=2018-07-06, endDate=2018-07-06)]> but was: java.util.ArrayList<[ViewPlanDetailDto(detailId=1, name=CSS, description=CSS is a cornerstone technology of the World Wide Web, alongside HTML and JavaScript., instructor=Mozilla Firefox Foundation, startDate=2018-07-06, endDate=2018-07-06), ViewPlanDetailDto(detailId=2, name=HTML, description=Hypertext Markup Language is the standard markup language for creating web pages and web applications., instructor=W3 Schools, startDate=2018-07-06, endDate=2018-07-06)]>

Что я пробую: Переопределить равно на PlanDetail, ViewPlanDetailDto, Plan но все это провалилось.

Переопределения Equals и Hashcode:

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof ViewPlanDetailDto))
            return false;
        ViewPlanDetailDto other = (ViewPlanDetailDto) obj;
        if (description == null) {
            if (other.description != null)
                return false;
        } else if (!description.equals(other.description))
            return false;
        if (detailId == null) {
            if (other.detailId != null)
                return false;
        } else if (!detailId.equals(other.detailId))
            return false;
        if (endDate == null) {
            if (other.endDate != null)
                return false;
        } else if (!endDate.equals(other.endDate))
            return false;
        if (instructor == null) {
            if (other.instructor != null)
                return false;
        } else if (!instructor.equals(other.instructor))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (startDate == null) {
            if (other.startDate != null)
                return false;
        } else if (!startDate.equals(other.startDate))
            return false;
        return true;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((description == null) ? 0 : description.hashCode());
        result = prime * result + ((detailId == null) ? 0 : detailId.hashCode());
        result = prime * result + ((endDate == null) ? 0 : endDate.hashCode());
        result = prime * result + ((instructor == null) ? 0 : instructor.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((startDate == null) ? 0 : startDate.hashCode());
        return result;
    }

Когда я пытаюсь это утверждать, это всегда терпит неудачу, даже если результат идентичен.

На основе IntelliJ ошибка сравнения он выделил конечное пространство в ожидаемой части, которую я не понимаю, как это закончилось с конечным пробелом.

AssertionError в ArrayList с тем же выводом

0
0
292
1

Ответы 1

Вы, вероятно, неправильно переопределяете equals() .
Чтобы понять и исправить вашу проблему, вы должны начать с базового: модульного тестирования вашего метода equals() (и, кстати, подумайте о переопределении hashCode(), чтобы оно соответствовало контракту equals()).

Как бы то ни было, переопределение equals() путем указания всех полей экземпляра класса для выполнения некоторых утверждений в модульном тесте обычно является чем-то, чего вы можете избежать и должны делать, если это приводит к нежелательному поведению equals().
equals() имеет семантику, определенную в Object.equals():

Indicates whether some other object is "equal to" this one.

Вы должны придерживаться этого. Обычно я использую библиотеку сопоставления для модульного тестирования, такую ​​как Harmcrest или AssertJ, чтобы выполнять утверждения в поле объекта в ненавязчивой, простой и понятной форме.

С AssertJ ваше утверждение может выглядеть так:

Assertions.assertThat(planRepository.findAllBy(planA.getId()))
          // assert result size
          .hasSize(2) 
          // extract a field to assert
          .extracting(ViewPlanDetailDto::getPlanDetail) 
          // extract still finer fields to assert
          .extracting(PlanDetail::getId, p -> p.getModule().getName(), p -> p.getModule().geDescription(), ... other fields to assert)
          // declare values expected
          .containsExactly(Tuple.tuple(planDetailA.getId(), "CSS", "CSS is a cornerstone technology of the World Wide Web, alongside HTML and JavaScript.",
                                       planDetailB.getId(), "HTML", "Hypertext Markup Language is the standard markup language for creating web pages and web applications.",
                                       ... other expected tuples ));

Могу ли я переопределить только метод equals в ViewPlanDetailDto?

Ricardo Raz 06.07.2018 11:49

Если вы выберете эту опцию, вам придется переопределить их все. Начните постепенно: напишите модульный тест для каждого замененного вами equals().

davidxxx 06.07.2018 19:49

Создает ли ArrayList конечный пробел? Я обновил свой вопрос, указав на то, что мой тест не прошел.

Ricardo Raz 08.07.2018 15:25

Другие вопросы по теме