2017-01-17 6 views
2
public void onCreateAccountButtonClicked(Go99ApplicationconfigureApplication) { 
    Log.i(TAG, " On create account button clicked"); 

    PasswordAndEmailValidator passwordAndEmailValidator = new PasswordAndEmailValidator(); 
    if (signUpView.getFirstName().isEmpty() || signUpView.getLastName().isEmpty() || signUpView.getEmailAddress().isEmpty() || signUpView.getPassword().isEmpty() 
      || signUpView.getConfirmPassword().isEmpty()) { 
     signUpView.showErrorMessage("Field empty"); 
     return; 
    } 

    if (!passwordAndEmailValidator.validatePassword(signUpView.getPassword())) { 
     signUpView.showErrorMessage("Password must be a at least 6 characters long."); 
     return; 
    } 

    if (!signUpView.getConfirmPassword().equals(signUpView.getPassword())) { 
     signUpView.showErrorMessage("Passwords don't match"); 
     return; 
    } 

    RequestGSON requestGSON = new RequestGSON(); 
    requestGSON.setEmail(signUpView.getEmailAddress().replaceAll("\\s", "").toLowerCase()); 
    requestGSON.setFirstName(signUpView.getFirstName()); 
    requestGSON.setLastName(signUpView.getLastName()); 
    requestGSON.setPassword(signUpView.getPassword()); 

    creationService.createUser(requestGSON).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleSubscriber<RestResponse>() { 

     @Override 
     public void onSuccess(RestResponse value) { 
      Object data = value.getData(); 
      String dataString = gson.toJson(data); 
      CreatedUserObjectData createdUserObjectData = gson.fromJson(dataString, CreatedUserObjectData.class); 
      signUpView.login(configureApplication, createdUserObjectData.getUserId(), signUpView.getEmailAddress().toLowerCase().replaceAll("\\s", ""), signUpView.getPassword()); 

     } 

     @Override 
     public void onError(Throwable error) { 

     } 
    }); 

} 

このメソッドをテストする必要があります。私はMockitoを使用しています。 RxJavaを使用しているときにonSuccess()メソッドのテストを手伝ってください。ユニットテストOnSuccess in RxJava

+0

SignUpView.login(...)を確認する必要があります。 – Rick

答えて

0

あなたの方法をテストする方法はたくさんあります。しかし、あなたの疑問がRxJavaの部分をどのようにテストすればTestSubscriberを使うことができるでしょうか。あなたはhereの例を確認することができます。

問題は、onCreateAccountButtonClickedメソッド内に多くのコードがあり、複数の責任があるということです。同じメソッドで多くのテストが行​​われます。 PasswordAndEmailValidatorとcreatingServiceを個別にテストする方が良い方法です。

まあ、しかし、あなたは正常に応答をテストしたいですか?あなたはおそらく、あなたのサーバーを模擬する必要があります

TestSubscriber<RestResponse> testSubs = new TestSubscriber<>(); 
creationService.createUser(requestGSON).subscribe(testSubs); 

testSubs.assertCompleted() 

あなたはこれを行うことができます。あなたは使用することができますMockWebServer

編集1:

あなたはクラスのメソッドが呼び出されるかどうかをテストしたい場合行うこの:

1 - >あなたがしようとしているRxJavaを使用しているとSchedulerProviderを注入する必要があります。そのため、すべてのSchedulerが即時に実行されます。

public class ImmediateSchedulerProvider { 

    @NonNull 
    @Override 
    public Scheduler computation() { 
     return Schedulers.immediate(); 
    } 

    @NonNull 
    @Override 
    public Scheduler io() { 
     return Schedulers.immediate(); 
    } 

    @NonNull 
    @Override 
    public Scheduler ui() { 
     return Schedulers.immediate(); 
    } 
} 

そして、あなたがテストするRxJava機能で、このクラスを注入:このように

。この方法では、常に同じスレッドにとどまっているので、応答なしでテストを終了することはありません。

[OK]を今すぐ2番目の手順。

2 - >あなたがテストしたいあなたのビューのモックを注入します。サインアップの権利ですか?したがって、このようなあなたのクラスをインスタンス化:

@Mock 
SighUpView sighUpView 

@Before 
public void setup(){ 
    MockitoAnnotations.initMocks(this); 
} 

次に、あなたのテストを行う呼び出し、Mokito.verify(TのT)メソッドを使用し

3 - >

@Test 
public void someTest(){ 

//Inject your mock ImeddiateScheculerProvider here or elsewhere. 
mSomeClass.onCreateAccountButtonClicked(mGo99ApplicationconfigureApplication, mImmediateSchudelerProvider. 

//You must verify that your method was called with correct parameters! 
Mockito.verify(sighUpView).login(configureApplication, createdUserObjectData.getUserId(), signUpView.getEmailAddress().toLowerCase().replaceAll("\\s", ""), signUpView.getPassword()); 
} 

まあ、それはありますそれ。これを例として使用し、ニーズに合わせて調整してください。

より完全な実装が必要な場合は、this repoをGoogleでチェックすることができます。

ハッピーコーディング!

+0

返信ありがとうございます。以下のコードが呼び出されていることを確認します。 signUpView.login(configureApplication、createdUserObjectData.getUserId()、signUpView.getEmailAddress()。toLowerCase()。replaceAll( "\\ s"、 "")、signUpViewパスワードを取得()); – Rick

+0

あなたは何でもお勧めしますか? – Rick

+0

はい、私は提案があります。私の編集をチェックしてください。それがあなたを助けることを願っています –

関連する問題