簡體   English   中英

Junit 4 assertEquals(...)無法比較兩個對象

[英]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()結果,而如果emailnullother.email == nullother.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM