繁体   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