1

私はかなり新しいandroid & javaです。UnitTest for Firebaseコールバックが確実に呼び出される

public class RegistrationViewModelUnitTest { 

private RegistrationViewModel viewModelUnderTest; 
private iRegistrationViewCallback mockView; 
private FirebaseAuth mockAuth; 


@Before 
public void SetUp() { 
    mockView = mock(iRegistrationViewCallback.class); 
    mockAuth = mock(FirebaseAuth.getInstance().getClass()); 
    viewModelUnderTest = new RegistrationViewModel(mockView,mockAuth); 
} 

@Test 
public void progressBarIsDismissedWhenRegistrationIsSuccessFul() throws Exception { 
    String email = "somusername"; 
    String password = "somePassword"; 
    viewModelUnderTest.email = email; 
    viewModelUnderTest.password = password; 
    viewModelUnderTest.createUser(); 
    verify(mockAuth).createUserWithEmailAndPassword(email,password); 
    verify(mockView).doSomething(); 
} 

} 

verify(mockView).doSomething();:私はFirebaseメソッドは、特定のコールバックが成功

public class RegistrationViewModel { 

private iRegistrationViewCallback viewCallback; 
private FirebaseAuth mAuth; 
public String email; 
public String password; 

public RegistrationViewModel(iRegistrationViewCallback view, FirebaseAuth mockAuth) { 
    viewCallback = view; 
    mAuth = mockAuth; 
} 

public void createUser() { 

    mAuth.createUserWithEmailAndPassword(email, password) 
      .addOnCompleteListener((Executor) this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        viewCallback.doSomething(); 
       } 
      }); 

} 

public void setEmail(String email) { 
    this.email = email; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 
} 

に解雇された私のユニットテストはこのようになっていることを正しいパラメータ&と呼ばれていることを確認するユニットテストを書くことをしようとしています明らかに失敗する。

成功するとviewCallback.doSomething();が呼び出されたことを確認するにはどうすればよいでしょうか。どういうわけかonCompleteをスタブする必要がありますか?またはこれを行う別の方法がありますか?私はFirebaseコードをインターフェイスの後ろに置くことを考えましたが、コールバックが起動されたことを確認する方法をまだ理解できません。 私はMockitoを使っています。

+0

createUserWithEmailAndPasswordメソッドの実装を追加できますか? –

+0

また、FirebaseAuthはシングルトンですか? –

+0

それはコードが公に利用可能でないことを私が伝えることができる限り、firebase sdkの一部です。 https://developers.google.com/android/reference/com/google/firebase/auth/FirebaseAuth.html#createUserWithEmailAndPassword(java.lang.String,%20java.lang.String) –

答えて

0

これは、統合テストのシナリオによく似ています。

あなたはユニットテスト、それにしたい場合、私は次の操作を行います:

ステップ1)

ではなく、匿名クラスを使用するのでは、コールバックの振る舞いを持つパブリッククラスを作成します。

public class MyOnCompleteListener implements OnCompleteListener<AuthResult>() { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 
      viewCallback.doSomething(); 
     } 
}); 

ステップ2)

あなたのレコード生成を変更

EUSER方法に関する:

public void createUser() { 

    mAuth.createUserWithEmailAndPassword(email, password) 
      .addOnCompleteListener((Executor) this 
         , new MyOnCompleteListener<AuthResult>()); 

} 

工程3)次のように

がテストを定義:

@Test 
public void progressBarIsDismissedWhenRegistrationIsSuccessFul() throws Exception { 
    String email = "somusername"; 
    String password = "somePassword"; 
    viewModelUnderTest.email = email; 
    viewModelUnderTest.password = password; 

    Task taskMock = mock(Task.class); 
    when(mockAuth.createUserWithEmailAndPassword (email, password)).thenReturn(taskMock); 

    viewModelUnderTest.createUser(); 
    verify(mockAuth, times(1)).createUserWithEmailAndPassword(email,password); 
    verify(taskMock, times(1)).addOnCompleteListener(any(RegistrationViewModel.class) 
      , any(MyOnCompleteListener.class)); 
} 

一番下の行であることをあなたの特定のコールバックがcreateUserWithEmailAndPassword方法のために登録されていることを確認。

フレームワークコードを実際に呼び出すことなく単体テストにしたい場合は、これで済むでしょう。

+0

コメントをいただきありがとうございます。上記のサンプルコードを使用して、動作する解決策を見つけることができました:) –

関連する問題