我创建了一个类并重写了equals()方法。当我使用assertTrue(obj1.equals(obj2))
时,它将通过测试;但是,assertEquals(obj1, obj2)
将无法通过测试。有人可以告诉原因吗?
答案 0 :(得分:31)
我的猜测是你没有实际覆盖equals
- 你已经超载了它。使用@Override
注释在编译时找到这种东西。
换句话说,我怀疑你有:
public boolean equals(MyClass other)
你应该在哪里:
@Override // Force the compiler to check I'm really overriding something
public boolean equals(Object other)
在你的工作断言中,毫无疑问,调用重载方法的编译时类型obj1
和obj2
都是MyClass
(或者你的类被调用)。 JUnit的assertEquals
只会调用equals(Object)
,因为它不知道更好。
答案 1 :(得分: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
值的比较,我只能想到一个与您描述的方式相同的情况。
答案 2 :(得分:0)
正如其他人提到的,您需要覆盖 equals() 函数。如果您使用某些 IDE,这会容易得多。例如,在 Eclipse 中,在您的 java 文件中,右键单击 -> 源代码 -> 生成 hashCode() 和 equals(),即可。再次运行测试,现在应该可以通过了。
生成这些方法也是一种很好的做法,因为它们各有优势,这将使您的代码更强大,并使其更加符合 OOAD 原则。