2011-05-19 87 views
21

我创建了一个类并重写了equals()方法。当我使用assertTrue(obj1.equals(obj2))时,它会通过测试;但是,assertEquals(obj1, obj2)将无法​​通过测试。有人可以告诉原因吗?JUnit assertEquals()对两个对象失败

+2

我们需要看到equals方法的代码 – hvgotcodes 2011-05-19 15:18:13

+0

'obj1'和'obj2'是同一类型吗? – 2011-05-19 15:18:39

+0

您是否在调试模式下尝试使用assertEquals重写的相等值? – VirtualTroll 2011-05-19 15:19:15

回答

30

我的猜测是,你有没有实际上覆盖equals - 你已经超载它来代替。在编译时使用@Override注释来找出这种东西。

换句话说,我怀疑你有:

public boolean equals(MyClass other) 

,你应该有:

@Override // Force the compiler to check I'm really overriding something 
public boolean equals(Object other) 

在你的工作断言,你无疑调用重载方法obj1obj2的编译时间类型都是MyClass(或不管你的类被称为)。 JUnit的assertEquals只会呼叫equals(Object),因为它不知道更好。

+1

它在我将公共布尔等于(MyClass其他)更改为公共布尔等于(对象其他)时起作用。谢谢乔恩。 – 2011-05-19 15:33:03

+0

@nikel:'Date'是可变的,这使得很难很好地实现平等 - 你可以有一个'HashSet ',一旦你突变了一个条目,你将无法再找到它...... – 2015-05-13 10:38:15

+0

重新添加评论 - 我想知道为什么日期不会覆盖其等于执行... – nikel 2015-05-13 10:41:34

1

这里是assertEquals代码(从Github):

static public void assertEquals(String message, Object expected, 
     Object actual) { 
    if (expected == null && actual == null) 
     return; 
    if (expected != null && isEquals(expected, actual)) 
     return; 
    else if (expected instanceof String && actual instanceof String) { 
     String cleanMessage= message == null ? "" : message; 
     throw new ComparisonFailure(cleanMessage, (String) expected, 
       (String) actual); 
    } else 
     failNotEquals(message, expected, actual); 
} 

private static boolean isEquals(Object expected, Object actual) { 
    return expected.equals(actual); 
} 

我能想到的只有一个情况下这种行为你描述的方式 - 如果你的equals方法不正确处理攀比null值。

+0

你假设JUnit调用的'equals'与传入版本中调用的'equals'是一样的...... – 2011-05-19 15:23:54

+0

@Jon是的,只是注意到你已经正确地猜到了这个问题。 – 2011-05-22 06:52:46