2017-07-18 1 views
1

私は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); 

} 

}

私はイコール()メソッドを実装し、それはまだ動作していません。

+0

'UserRegisterFormDTO'クラスの 'equals'メソッドを教えてください。 –

+0

これを実装する必要があります。さもなければ、 'eq(userRegisterFormDTO)'を書くと、Mockitoは 'Object'からデフォルト実装を呼び出すだけです。これは本当にあなたが望むものではありません。 –

+0

@DawoodibnKareem編集しました。私は自動的に私のIDE(Androidスタジオ)でメソッドを生成しました。ただし、テストはまだ正しくない – Konrad

答えて

0

これが答えです:

私は同じ方法ではないだけを実装するために必要な、だけでなく、私の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; 
} 

}

テストパス:それは今どのように見えるかをここで 。

関連する問題