java.lang.AssertionError:expected

时间:2014-12-30 00:11:04

标签: unit-testing testing

尽管期望值与实际值匹配,但我的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]

我在这里做错了什么?

3 个答案:

答案 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)是否实际返回您之前设置的用户。

发布UseruserDAO类型的实施可能有助于进一步澄清。

答案 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);

尽管两种情况下编译器都不会抱怨,但第二种情况下断言显然会失败