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

Java 比较两个对象时JUnit assertEquals()不起作用,java,unit-testing,testing,methods,junit,Java,Unit Testing,Testing,Methods,Junit,我正在努力掌握Java的诀窍。单元测试对我来说非常重要,所以最近我开始使用JUnit。开始很难,但我已经掌握了窍门。到目前为止,我的所有测试都进行了,除了比较同一类的两个对象(我没有尝试测试创建不同类对象的函数)。基本上,当我在一个类中有一个方法创建该类的一个新实例,并且我尝试测试该方法时,我会得到一个奇怪的错误 “预期:runnersLog。MTLog@433c675d但那是runnersLog。MTLog@3f91beef" 我试过研究这个问题,但没有发现任何有用的东西。指向github上我

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

“预期:runnersLog。MTLog@433c675d但那是runnersLog。MTLog@3f91beef"

我试过研究这个问题,但没有发现任何有用的东西。指向github上我的类的链接。我尝试测试的方法是
mt()
方法,测试类是
ILogTest


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

assertEquals
将使用
object#equals
来比较每个对象。看起来您的类
ILogTest
没有重写
equals
方法,因此调用
Object\equals
只会自己比较引用,因为它们是不同的对象引用,所以结果将为false

您有两个选择:

  • ILogTest
    中重写
    public boolean equals(对象o)
  • 在实现
    equals
    方法的相关字段上使用
    assertEquals
    ,例如
    String
    Integer
    Long
    等。此方法需要更多代码,但在无法修改所断言的类时非常有用

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

    在EclipseIDE中,您可以通过选择source->GenerateHashCode()和equals()来实现


    还有一件事,当您实现这两个对象中的一个时,必须同时实现另一个。

    您需要超越equals,超类对象中的equals方法检查引用,如果两个引用都指向同一个对象,equals为true,如果不是false,因此,您需要写下一个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.
    
    要了解更多信息,您可以查看:

    你没有
    等于
    。你是什么意思?当涉及到对象时,我是否需要使用该方法而不是assertEquals?可能重复@Lashane我不会说它是重复的,但这是解决问题的一种方法。谢谢,我不知道为什么这个问题会受到负面关注,但你对我说得很清楚-欢呼当equals()被忽略时,测试的代码是如何变化的?如果你正确地覆盖了
    equals
    方法,那么你就不必在单元测试中改变任何东西(这是假设equals得到了正确的实现)。所以当你生成这些新方法时,它们需要额外的注意吗?你不必覆盖(不实现)这两个方法。这是一个建议,但不是必须的。@Luiggi,如果你为了运动目的而覆盖它们,是的,你不需要同时覆盖它们。但实际上,您可以覆盖它们,因为这是有原因的,而这个原因在默认实现中找不到答案。所以,这两个都是推荐的,也是一个非常好的主意。不要相信我的话,但是@David请看一下如何编写这些方法。如果你碰巧有一份,也可以在那里咨询。这是一本很棒的书。我知道这一点,但有时候最好的解决办法是:不要。