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()
结果,而如果 email
是 null
,你想要 return
true
if other.email == null
和 false
否则
无论如何,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));
}
错误信息:
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()
结果,而如果 email
是 null
,你想要 return
true
if other.email == null
和 false
否则
无论如何,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));
}