[英]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.