为什么以下代码给我一个错误,我很困惑。
@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
我知道它们是同一个对象的不同实例,但为什么会出现这个错误?
答案 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都可以帮助您正确生成它。