Assert失败错误-java

zc0qhyus  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(428)

我很难理解为什么这个单元测试不起作用。我正在创建两个@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)

你能给我解释一下吗?谢谢!

mccptt67

mccptt671#

从理论上讲,实施 equalsRegionWithActivities 使您的测试用例作为 assertEquals 基于 equals()RegionWithActivities . 但实施公正 equals() 而且没有实施 hashcode() 对象类contract 2是否如下所述-
hashcode的总合同是:
在java应用程序执行期间,每当在同一对象上多次调用hashcode方法时,只要不修改对象的equals比较中使用的信息,hashcode方法就必须始终返回相同的整数。从一个应用程序的一个执行到同一应用程序的另一个执行,这个整数不需要保持一致。
如果根据equals(object)方法两个对象相等,那么对两个对象中的每个对象调用hashcode方法必须产生相同的整数结果。
根据equals(java.lang.object)方法,如果两个对象不相等,则对这两个对象中的每一个调用hashcode方法都必须产生不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

u7up0aaq

u7up0aaq2#

当您使用assertequals时,它会尝试使用equals()方法比较两个对象。如果尚未重写类中对象类的equals()方法,则它将使用对象类的默认equals()方法,该方法的实现如下:

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

如您所见,这里它只是比较对象引用,因为在您的示例中,两个对象有两个不同的引用,所以Assert失败,所以您需要在regionwithactivities类中实现equals()方法,作为最佳实践,当您重写equals()时,您还应该重写hashcode()方法,但你的Assert没有必要通过。

相关问题