Модульное тестирование — ошибка утверждения — Java

#java #unit-testing #junit

#java #модульное тестирование #junit

Вопрос:

У меня возникли проблемы с пониманием того, почему этот модульный тест не работает. Я создаю два экземпляра @RegionWithActivities и подумал, что он должен пройти тест.

     @Test
    void testAreEqual()
    {
        RegionWithActivities regionWithActivities1 = new RegionWithActivities(4, regions);
        RegionWithActivities regionWithActivities2 = new RegionWithActivities(4, regions);

        assertEquals(regionWithActivities1, regionWithActivities2);
    }

  

Ошибка заключается в:

 org.opentest4j.AssertionFailedError: expected: com.luciaandres.analysis.RegionWithActivities@710726a3<RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}> but was: com.luciaandres.analysis.RegionWithActivities@646007f4<RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}>
Expected :RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}
Actual   :RegionWithActivities{numberOfActivities=4, regionIds=[4DA19B2B1328127FC062FB79F6F435A5, B66FA66DA650717E0964A4E30A716DAE, C841C0BED1CCDD643955065A696EED34, F2D04F76EA1EBD6C8E3AEDD506FBA35A]}


    at RegionWithActivitiesTest.testAreEqual(RegionWithActivitiesTest.java:29)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)

  

Не могли бы вы, пожалуйста, объяснить мне?
Спасибо!

Комментарии:

1. Есть ли у вас класс equals и hashCode ли он реализован для RegionWithActivities ?

2. Вы абсолютно правы. Я новичок. Спасибо за вашу помощь!

Ответ №1:

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

 public boolean equals(Object obj) {
       return (this == obj);    
}
  

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

Ответ №2:

Теоретически, можно просто реализовать equals в RegionWithActivities , чтобы ваш тестовый пример проходил как assertEquals утверждения на основе equals() of RegionWithActivities . Но реализация просто equals() и не реализация hashcode() привела бы к нарушению контракта класса объектов 2, как указано ниже —

Общий контракт хэш-кода заключается в:

  1. Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения Java-приложения, метод hashCode должен последовательно возвращать одно и то же целое число, при условии, что информация, используемая в сравнениях equals для объекта, не изменена. Это целое число не обязательно должно оставаться согласованным от одного выполнения приложения до другого выполнения того же приложения.
  2. Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен выдавать один и тот же целочисленный результат.
  3. Не требуется, чтобы, если два объекта неравны в соответствии с equals (java.lang.Метод Object), затем вызов метода hashCode для каждого из двух объектов должен приводить к различным целочисленным результатам. Однако программист должен знать, что получение различных целочисленных результатов для неравных объектов может повысить производительность хэш-таблиц.