单元测试-断言失败错误-Java

单元测试-断言失败错误-Java,java,unit-testing,junit,Java,Unit Testing,Junit,我很难理解为什么这个单元测试不起作用。 我正在创建@RegionWithActivities的两个实例,我认为它应该通过测试 @Test void testAreEqual() { RegionWithActivities regionWithActivities1 = new RegionWithActivities(4, regions); RegionWithActivities regionWithActivities2 = new

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

org.opentest4j.assertionfailederor:expected:com.luciaandres.analysis。RegionWithActivities@710726a3但是是:com.luciaandres.analysis。RegionWithActivities@646007f4
预期:活动区域{numberOfActivities=4,区域ID=[4DA19B2B1328127FC062FB79F46F435A5,B66FA66DA65071E0964A4E30A716DAE,C841CD64395065A696EED34,F2D04F76EA1EBD6C8E3AEDD506FBA35A]}
实际:活动区域{numberOfActivities=4,区域ID=[4DA19B2B1328127FC062FB79F46F435A5,B66FA66DA65071E0964A4E30A716DAE,C841CD64395065A696EED34,F2D04F76EA1EBD6C8E3AEDD506FBA35A]}
在RegionWithActivitiesTest.testareQual(RegionWithActivitiesTest.java:29)
位于java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
位于java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
你能给我解释一下吗?
谢谢

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

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

正如您所看到的,这里它只是比较对象引用,因为在您的案例中两个对象有两个不同的引用,所以断言失败,所以您需要在RegionWithActivities类中实现equals()方法,作为重写equals()的最佳实践,您还应该重写hashcode()方法,但是您的断言不一定要通过。

理论上,只需在
RegionWithActivities
中实现
equals
,就可以使您的测试用例作为基于
RegionWithActivities的
equals()
断言通过。但是只实现
equals()
而不实现
hashcode()
将导致如下所述的错误-

hashCode的总合同为:

  • 在Java应用程序的执行过程中,每当在同一对象上多次调用hashCode方法时,只要没有修改对象上的equals比较中使用的信息,hashCode方法必须始终返回相同的整数。从应用程序的一次执行到同一应用程序的另一次执行,该整数不必保持一致
  • 如果根据equals(Object)方法两个对象相等,则对两个对象中的每个对象调用hashCode方法必须产生相同的整数结果。
  • 根据equals(java.lang.Object)方法,如果两个对象不相等,则对这两个对象中的每一个调用hashCode方法都必须产生不同的整数结果,这不是必需的。但是,程序员应该知道,为不相等的对象生成不同的整数结果可能会提高哈希表的性能

  • 您是否为
    RegionWithActivities
    类实现了
    equals
    hashCode
    ?您完全正确。我是个新手。谢谢你的帮助!