私はAndroid MVPアーキテクチャを使用しており、テストで問題を解決しようとしています。Android MVP - eq(ObjectDTO)を渡さず、値を抜くためのMockitoテスト
ユーザーが登録フォームで確認ボタンをクリックすると、そのユーザーが正常に作成されたことをテストし、作成したオブジェクトを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から抽出した値のために正常に動作します。なにが問題ですか?
UPDATE:ここに は私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);
}
}
私はイコール()メソッドを実装し、それはまだ動作していません。
'UserRegisterFormDTO'クラスの 'equals'メソッドを教えてください。 –
これを実装する必要があります。さもなければ、 'eq(userRegisterFormDTO)'を書くと、Mockitoは 'Object'からデフォルト実装を呼び出すだけです。これは本当にあなたが望むものではありません。 –
@DawoodibnKareem編集しました。私は自動的に私のIDE(Androidスタジオ)でメソッドを生成しました。ただし、テストはまだ正しくない – Konrad