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

JUnit assertEquals() not working when comparing two objects

我正在尝试掌握 Java 的窍门。单元测试对我来说非常重要,所以最近我开始使用 JUnit。开始时很难,但我正在掌握它。到目前为止,我的所有测试都已完成,除了比较两个相同 class 的对象(我没有尝试测试创建不同 class 的对象的函数)。基本上,当我在 class 中有一个创建 class 的新实例的方法,并且我尝试测试该方法时,我得到了一个奇怪的错误。

"expected:runnersLog.MTLog@433c675d but was runnersLog.MTLog@3f91beef"

我已经尝试研究这个问题,但没有找到任何有用的东西。 Here's link 到 github 我的 class。我要测试的方法是mt()方法,测试class是ILogTest

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

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

您有两个选择:

  1. 覆盖 ILogTest 中的 public boolean equals(Object o)
  2. 在实现 equals 方法的相关字段上使用 assertEquals,例如StringIntegerLong 等。这需要更多代码,但在您无法修改断言的 class(es) 时非常有用。

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

在 eclipse IDE 中,您可以通过选择 source -> generate hashCode() and 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.

要了解更多信息,您可以查看: Why do I need to override the equals and hashCode methods in Java?