Java JUnit assertSame对两个对象返回true

Java JUnit assertSame对两个对象返回true,java,unit-testing,junit,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.l

为什么下面的代码给了我一个错误,我很困惑

@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
预期相同:不是:
java.lang.AssertionError

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

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()


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

用户的代码是什么??请务必阅读选择标记时出现的说明!你好,谢谢你的回答。当我使用assertEquals时(user1,user2);这给了我同样的错误。有什么线索吗?在这种情况下,您是否在
User
中实现了
equals()
?如果您没有,则
expected.equals(actual)
将使用
对象#equals()
,它只返回
expected==actual
,这可能不是您想要的。不,我没有在User中实现equals,在使用assertEquals()时需要这样做吗?是的,您需要。正如我所说,如果您尚未实现
equals()
,则
对象的默认实现将用于
expected.equals(actual)
,它只返回
expected==equals
;与在
assertSame()
中执行的操作完全相同。谢谢,我将研究equals方法。我之所以提出这个问题,是因为我的一些朋友正在从事同一项任务,他们声称assertSame正在通过……:)谢谢。@tbodt或者不。。。可能是XY问题的另一种情况。不要依赖对象的默认实现来获得相等和哈希代码。。。在任何情况下,都应该实现它们,特别是在使用集合的情况下。;-)
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);
}