AssertionError в ArrayList с тем же выводом - PullRequest
0 голосов
/ 06 июля 2018

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

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

@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);

    }

StackTrace:

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 но все это не удалось.

Эквиваленты равных и хэш-кодов:

@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 , он выделил в завершающий пробел ожидаемую часть, которую я не понимаю, как это закончилось с завершающим пробелом.

Difference

1 Ответ

0 голосов
/ 06 июля 2018

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

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

Указывает, является ли какой-либо другой объект "равным" этому.

Вы должны придерживаться этого.
Обычно я использую библиотеку соответствия модуля тестирования, такую ​​как 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 ));
...