如何解决单元测试-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,F2D04F76EA1EBD6C8E3AEDD506FBA35A]}>
Expected :RegionWithActivities{numberOfActivities=4,F2D04F76EA1EBD6C8E3AEDD506FBA35A]}
Actual :RegionWithActivities{numberOfActivities=4,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()方法,但不必传递断言。
,从理论上讲,可以根据equals
的{{1}}在RegionWithActivities
中实施assertEquals
来使测试用例通过equals()
断言。但是仅实现RegionWithActivities
而不实现equals()
则会使紫罗兰色Object class contract 2如下所述-
hashCode的一般约定为:
- 只要在Java应用程序执行期间在同一对象上多次调用它,hashCode方法就必须一致地返回相同的整数,只要不修改该对象的equals比较中使用的信息即可。从应用程序的一次执行到同一应用程序的另一次执行,此整数不必保持一致。
- 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
- 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。