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 的 equals 实现。

@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);

returns 如果电子邮件相等则为 false,如果不相等则为 true。

你的意思是这样的:

return (email==null ? userDTO.email==null : email.equals(userDTO.email));

比较失败消息为您提供了您所期望的对象状态。
这两个对象显示相同的状态但是 assertEquals() 不相等的事实意味着 equals() 方法不依赖于声明字段的值,或者它也可能意味着 equals() 包含逻辑错误。

对你来说这是第二种情况:

 return  (email != null ? !email.equals(userDTO.email) : userDTO.email != null);

应该是:

return  (email != null ? email.equals(userDTO.email) : userDTO.email == null);

就好像 email 不是 null,您想要 return 此字段上的 equals() 结果,而如果 emailnull,你想要 return true if other.email == nullfalse 否则

无论如何,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));        
}