【发布时间】: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