繁体   English   中英

比较两个对象时,JUnit assertEquals()不起作用

[英]JUnit assertEquals() not working when comparing two objects

我正试图掌握Java。 单元测试对我来说非常重要,所以最近我开始使用JUnit。 这很难开始,但我已经掌握了它。 除了比较同一个类的两个对象(我没有尝试测试创建不同类的对象的函数)之外,我的所有测试都达到了这一点。 基本上,当我在一个类中创建一个类的新实例的方法时,我尝试测试该方法,我得到一个奇怪的错误。

“预计:runnersLog.MTLog@433c675d但是runnersLog.MTLog@3f91beef”

我试过研究这个问题,但没有找到任何帮助。 这是我在github上的类的链接。 我试图测试的方法是mt()方法,测试类是ILogTest

这不是我遇到这个问题的唯一情况。 对于任何具有返回同一类的新对象的方法的类,我得到的是完全相同的3f91beef错误(即使对象更复杂 - 带参数)

assertEquals将为每个被比较的对象使用Object#equals 看起来你的类ILogTest不会覆盖equals方法,所以调用Object#equals只会比较引用本身,因为它们是不同的对象引用,结果将是false。

您有两种选择:

  1. ILogTest覆盖public boolean equals(Object o)
  2. 在实现equals方法的相关字段上使用assertEquals ,例如StringIntegerLong等。这个需要更多代码,但是当你不能修改被断言的类时它很有用。

如果您使用现代IDE进行开发(如Eclipse,IntelliJ等),他们可以为您生成这些方法。 检查出来有两个原因:1)节省时间2)防止可能的错误。

在eclipse IDE中,您可以通过选择source - > generate hashCode()和equals()来实现。

还有一件事,当你实现这两个时,你也必须实现另一个。

你需要重写equals,超类Object中的equals方法检查引用是否两个引用指向同一个对象equals如果不为false则为true,所以你需要写下一个equals方法来检查你的对象内容并检查是否值是相同的,也建议您也覆盖hashCode方法。

一个例子可能是:

Custom a= new Custom("");
Custom b= a;

//b would be equal a. because they reference the same object.
Custom c= new Custom("");
//c would not be equal to a, although the value is the same.

要了解更多信息,您可以检查: 为什么我需要覆盖Java中的equals和hashCode方法?

暂无
暂无

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

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