JUnit assertEquals()对两个对象失败

时间:2011-05-19 15:12:43

标签: junit equals

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

3 个答案:

答案 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)

在你的工作断言中,毫无疑问,调用重载方法的编译时类型obj1obj2都是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 原则。