尽管期望值与实际值匹配,但我的TestNG测试实现会抛出错误。
以下是TestNG代码:
@Test(dataProvider = "valid")
public void setUserValidTest(int userId, String firstName, String lastName){
User newUser = new User();
newUser.setLastName(lastName);
newUser.setUserId(userId);
newUser.setFirstName(firstName);
userDAO.setUser(newUser);
Assert.assertEquals(userDAO.getUser().get(0), newUser);
}
错误是:
java.lang.AssertionError: expected [UserId=10, FirstName=Sam, LastName=Baxt] but found [UserId=10, FirstName=Sam, LastName=Baxt]
我在这里做错了什么?
答案 0 :(得分:2)
原因很简单。 Testng使用对象的equals方法来检查它们是否相等。因此,实现您正在寻找的结果的最佳方法是覆盖用户方法的equals方法,如下所示。
public class User {
private String lastName;
private String firstName;
private String userId;
// -- other methods here
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!User.class.isAssignableFrom(obj.getClass())) {
return false;
}
final User other = (User) obj;
//If both lastnames are not equal return false
if ((this.lastName == null) ? (other.lastName != null) : !this.lastName.equals(other.lastName)) {
return false;
}
//If both lastnames are not equal return false
if ((this.firstName == null) ? (other.firstName != null) : !this.firstName.equals(other.firstName)) {
return false;
}
//If both lastnames are not equal return false
if ((this.userId == null) ? (other.userId != null) : !this.userId.equals(other.userId)) {
return false;
}
return true;
}
}
它会像魔术一样工作
答案 1 :(得分:0)
您似乎要么比较错误的(第一个)对象,要么equals
未正确实现,因为它返回false。
显示的值只是字符串表示。它实际上并不意味着两个对象必须是平等的。
您应该检查userDAO.getUser().get(0)
是否实际返回您之前设置的用户。
发布User
和userDAO
类型的实施可能有助于进一步澄清。
答案 2 :(得分:0)
注意:请注意与该问题直接相关,但这是我的问题的答案,这使我对这个问题有所了解。我肯定会有更多人在寻找此解决方案的这篇文章中。
如果Equals方法需要重写,这并不是精确的解决方案,但由于以下原因,我经常发现自己被阻塞了:
如果您使用过Capture并主张对捕获值的相等性,请确保从捕获实例中获取捕获值。
例如:
Capture<Request> capturedRequest = new Capture<>();
this.testableObj.makeRequest(EasyMock.capture(capturedRequest))
Assert.assertEquals(capturedRequest.getValue(), expectedRequest);
V / S
Assert.assertEquals(capturedRequest, expectedRequest);
尽管两种情况下编译器都不会抱怨,但第二种情况下断言显然会失败