1

我對android & java相當陌生。我試圖寫一個單元測試,驗證了火力地堡方法調用正確的參數&特定回調是在成功發射針對Firebase的UnitTest確保回調被觸發

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; 
} 
} 

我的單元測試是這樣的:

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();顯然失敗了。

什麼是驗證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

感謝您的評論我使用上面的示例代碼來尋找工作解決方案:) –