【问题标题】:JUnit assertEquals() not working when comparing two objects比较两个对象时,JUnit assertEquals() 不起作用
【发布时间】:2015-09-11 00:25:06
【问题描述】:

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

“预期:runnersLog.MTLog@433c675d 但实际上是 runnersLog.MTLog@3f91beef”

我已尝试研究此问题,但没有找到任何帮助。 Here's github 上我的课程的链接。我要测试的方法是mt()方法,测试类是ILogTest

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

【问题讨论】:

  • 你没有equals
  • 什么意思?当涉及到对象时,我是否需要使用该方法而不是 assertEquals?
  • @Lashane 我不会说这是重复的,但这是解决问题的一种方法。

标签: java unit-testing testing methods junit


【解决方案1】:

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

你有两个选择:

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

【讨论】:

  • 谢谢,我不知道为什么这个问题会受到负面关注,但你对我说得很清楚 - 干杯
  • 当equals()被覆盖时,测试的代码如何变化?
  • 如果您正确地覆盖equals 方法,那么您将不必在单元测试中更改任何内容(这是假设正确实现了equals)。
【解决方案2】:

您需要重写equals,如果两个引用都指向同一个对象,则超类Object中的equals方法检查引用如果不是false,则equals为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?

【讨论】:

  • 谢谢,为我工作,使用类 Foo,而不是 kotlin 中的数据类 Foo。
【解决方案3】:

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

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

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

【讨论】:

  • 那么当您生成这些新方法时,是否需要额外注意?
  • 您不必重写(不实现)这两种方法。建议这样做,但没有必要。
  • @Luiggi,如果您出于运动目的而覆盖它们,是的,您不需要同时覆盖它们。但实际上,您会覆盖它们,因为这是有原因的,而该原因在默认实现中找不到答案。因此,将它们都写下来既是推荐的,也是一个非常好的主意。不要相信我的话,但check this out
  • @David 请查看this link 了解如何编写这些方法。如果您碰巧有一份Effective java 的副本,请也咨询那里。这是一本很棒的书。
  • 我知道,但有时最好的解决方案是:不要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2014-04-13
  • 2021-08-05
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多