[英]Junit 4 assertEquals(…) fails to compare two objects
錯誤信息:
Expected: UserDTO<UserDTO{username='user', password='password', email='mail@mail'}>
Actual: UserDTO<UserDTO{username='user', password='password', email='mail@mail'}>
唯一的區別是期望的字符串化對象的'>'之后的空格。 我不知道為什么,因為我比較了兩個UserDTO對象。 有人遇到過同樣的問題嗎?
更新:等於UserDTO的實現。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserDTO userDTO = (UserDTO) o;
if (username != null ? !username.equals(userDTO.username) : userDTO.username != null) return false;
if (password != null ? !password.equals(userDTO.password) : userDTO.password != null) return false;
return (email != null ? !email.equals(userDTO.email) : userDTO.email != null);
}
這個
return (email != null ? !email.equals(userDTO.email) : userDTO.email != null);
如果電子郵件相等,則返回false;如果電子郵件不相等,則返回true。
您的意思是這樣的:
return (email==null ? userDTO.email==null : email.equals(userDTO.email));
比較失敗消息為您提供了對象的狀態,它們是您期望和得到的。
這兩個對象顯示相同的狀態,但對於assertEquals()
這些對象不等於事實,這意味着equals()
方法不依賴於聲明的字段的值,或者也可能意味着equals()
包含邏輯錯誤(s)。
對您來說,這是第二種情況:
return (email != null ? !email.equals(userDTO.email) : userDTO.email != null);
應該 :
return (email != null ? email.equals(userDTO.email) : userDTO.email == null);
就像email
不為null
,您想在此字段上返回equals()
結果,而如果email
為null
, other.email == null
在other.email == null
return
true
,否則return
false
。
無論如何,可以通過使用Objects.equals()
比較每個字段來簡化equals()
方法,因為這樣Objects.equals()
對每個字段進行null
檢查:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserDTO userDTO = (UserDTO) o;
return (Objects.equal(username, userDTO.username) && Objects.equal(password, userDTO.password) && Objects.equal(email, userDTO.email));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.