繁体   English   中英

单元测试 - AssertionFailedError - Java

[英]Unit Testing - AssertionFailedError - Java

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

你能解释一下吗? 谢谢!

当您使用 assertEquals 时,它会尝试使用 equals() 方法比较两个对象。如果您没有在类中覆盖 Object 类中的 equals() 方法,它将使用 Object 类中的默认 equals() 方法,其实现如下:

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

如您所见,这里只是比较对象引用,并且因为在您的情况下两个对象有两个不同的引用,所以断言失败,因此您需要在 RegionWithActivities 类中实现 equals() 方法,并作为重写 equals() 时的最佳实践),您也应该覆盖 hashcode() 方法,但您的断言没有必要通过。

理论上,可以只在RegionWithActivities实现equals以使您的测试用例作为基于RegionWithActivities equals()assertEquals断言通过。 但是仅实现equals()而没有实现hashcode()将紫罗兰色对象类合同2 如下所述-

hashCode 的总合约为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM