【问题标题】:Android MVP - Mockito test not passing for eq(ObjectDTO), but passing for extracting values from itAndroid MVP - Mockito 测试未通过 eq(ObjectDTO),但通过从中提取值
【发布时间】:2017-07-18 20:44:11
【问题描述】:

我正在使用 Android MVP 架构并尝试解决我的测试问题。

当用户点击注册表单上的确认按钮时,它应该测试用户是否成功创建并将创建的对象传递给View。

这是我的测试(不是工作版本):

   @Test
   public void clickOnConfirmButtonWithValidInput_RegisterSuccessfulCalled(){
    when(view.getEmail()).thenReturn(USER_TEST_EMAIL);
    when(view.getUsername()).thenReturn(USER_TEST_USERNAME);
    when(view.getPassword()).thenReturn(USER_TEST_PASSWORD);
    when(view.getConfirmPassword()).thenReturn(USER_TEST_PASSWORD);

    UserRegisterFormDTO userRegisterFormDTO = new UserRegisterFormDTO(USER_TEST_EMAIL, USER_TEST_USERNAME, USER_TEST_PASSWORD);

    registerPresenter.confirmRegistrationButtonClicked();

    UserDTO userDTO = new UserDTO(USER_TEST_ID, userRegisterFormDTO.getUsername(), userRegisterFormDTO.getEmail());


    verify(model).createUser(eq(userRegisterFormDTO), createNewUserCallbackArgumentCaptor.capture());
    createNewUserCallbackArgumentCaptor.getValue().onUserCreated(userDTO);

    verify(view).registerSuccessful(userDTO);
}

这就是测试,成功了。

@Test
public void clickOnConfirmButtonWithValidInput_RegisterSuccessfulCalled(){
    when(view.getEmail()).thenReturn(USER_TEST_EMAIL);
    when(view.getUsername()).thenReturn(USER_TEST_USERNAME);
    when(view.getPassword()).thenReturn(USER_TEST_PASSWORD);
    when(view.getConfirmPassword()).thenReturn(USER_TEST_PASSWORD);

    UserRegisterFormDTO userRegisterFormDTO = new UserRegisterFormDTO(USER_TEST_EMAIL, USER_TEST_USERNAME, USER_TEST_PASSWORD);

    registerPresenter.confirmRegistrationButtonClicked();

    UserDTO userDTO = new UserDTO(USER_TEST_ID, userRegisterFormDTO.getUsername(), userRegisterFormDTO.getEmail());


    verify(model).createUser(eq(USER_TEST_USERNAME), eq(USER_TEST_EMAIL), eq(USER_TEST_PASSWORD),  createNewUserCallbackArgumentCaptor.capture());
    createNewUserCallbackArgumentCaptor.getValue().onUserCreated(userDTO);

    verify(view).registerSuccessful(userDTO);
}

异常是这样的: https://gist.github.com/oksett/4571d09557514e6fe7ada2cc21b28d46

所以我只从我的 UserRegisterFormDTO 对象中提取值并将其值作为参数传递给方法。

在我的演示者中,我使用了这样的模型方法:

@Override
public void confirmRegistrationButtonClicked() {
    if (view != null) {
        if (view.getUsername().trim().equals("") || view.getEmail().trim().equals("") || view.getPassword().trim().equals("") || view.getConfirmPassword().trim().equals("") || view.getPassword().length() < 6) {
            view.showInputError();
        } else {
            view.setRegisterProcessAlpha();
            view.showProgressBar();
            UserRegisterFormDTO userRegisterFormDTO = new UserRegisterFormDTO(view.getUsername(), view.getEmail(), view.getPassword());
            model.createUser(userRegisterFormDTO, new RegisterMVP.Model.CreateNewUserCallback() {
                @Override
                public void onUserCreated(UserDTO userDto) {
                    if (userDto != null) {
                        view.setRegisterNormalAlpha();
                        view.hideProgressBar();
                        view.registerSuccessful(userDto);
                    } else {
                        view.setRegisterNormalAlpha();
                        view.hideProgressBar();
                        view.showErrorMessage("Unfortunately user was not created, please try again");
                    }
                }
            });
        }

    }
}

因此,对于从 UserRegisterFormDTO 提取值作为参数到方法的测试正常工作。怎么了?

更新: 这是我的 UserRegisterFormDTO 类:

public class UserRegisterFormDTO {
private String username;
private String email;
private String password;

public UserRegisterFormDTO(String username, String email, String password) {
    this.username = username;
    this.email = email;
    this.password = password;
}

public String getUsername() {
    return username;
}

public String getEmail() {
    return email;
}

public String getPassword() {
    return password;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    UserRegisterFormDTO that = (UserRegisterFormDTO) o;

    if (!username.equals(that.username)) return false;
    if (!email.equals(that.email)) return false;
    return password.equals(that.password);

}

}

我实现了equals()方法,但还是不行。

【问题讨论】:

  • 你能告诉我们UserRegisterFormDTO 类中的equals方法吗?
  • 你需要实现它。否则,当你写eq(userRegisterFormDTO) 时,Mockito 只会从Object 调用默认实现,这真的不是你想要的。
  • @DawoodibnKareem 我进行了编辑。我使用我的 IDE(Android Studio)自动生成了该方法。但是,测试仍然不正确
  • 好的,你在第三个灰色块中显示的方法的签名是什么?
  • @DawoodibnKareem 我进行了编辑

标签: java android unit-testing mockito mvp


【解决方案1】:

这就是答案:

我不仅需要实现 equal 方法,还需要实现 hashCode 到我的 UserRegistrationFormDTO。 这是现在的样子:

public class UserRegisterFormDTO {
private String username;
private String email;
private String password;

public UserRegisterFormDTO(String username, String email, String password) {
    this.username = username;
    this.email = email;
    this.password = password;
}

public String getUsername() {
    return username;
}

public String getEmail() {
    return email;
}

public String getPassword() {
    return password;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    UserRegisterFormDTO that = (UserRegisterFormDTO) o;

    if (username != null ? !username.equals(that.username) : that.username != null)
        return false;
    if (email != null ? !email.equals(that.email) : that.email != null) return false;
    return password != null ? password.equals(that.password) : that.password == null;

}

@Override
public int hashCode() {
    int result = username != null ? username.hashCode() : 0;
    result = 31 * result + (email != null ? email.hashCode() : 0);
    result = 31 * result + (password != null ? password.hashCode() : 0);
    return result;
}

}

现在测试通过了。

【讨论】:

    猜你喜欢
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多