JUnit assertSame用两个对象返回true

时间:2014-05-10 22:10:13

标签: java unit-testing junit

为什么以下代码给我一个错误,我很困惑。

@Test
public void testUsers()
{
    User user1 = new User("a");
    User user2 = new User("a");
    assertSame(user1, user2);
}

这是我目前收到的错误:

expected same:<xxx.xxx.User@615fd9fd> was not:<xxx.xxx.User@5be0a2fc>
java.lang.AssertionError

我知道它们是同一个对象的不同实例,但为什么会出现这个错误?

2 个答案:

答案 0 :(得分:2)

assertSame()的源代码是:

static public void assertSame(Object expected, Object actual) {
    assertSame(null, expected, actual);
}

static public void assertSame(String message, Object expected, Object actual) {
    if (expected == actual) {
        return;
    }
    failNotSame(message, expected, actual);
}

所以assertSame()测试提供的引用指向完全相同的对象,在你的情况下它们不是。

你想要的可能是assertEquals()

static public void assertEquals(String message, Object expected,
        Object actual) {
    if (equalsRegardingNull(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 equalsRegardingNull(Object expected, Object actual) {
    if (expected == null) {
        return actual == null;
    }

    return isEquals(expected, actual);
}

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

答案 1 :(得分:-2)

您必须在User对象上实现equals()和hashCode()...大多数IDE都可以帮助您正确生成它。