1

Ich bin ziemlich neu für Android & Java. Ich versuche, eine Unit-Test zu schreiben, die überprüft, ob Firebase Methode mit korrekten Parametern aufgerufen wird &, dass bestimmte Rückruf auf Erfolg abgefeuert wirdUnitTest gegen Firebase sicherstellen, dass Rückruf ausgelöst wird

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

My Unit-Test sieht wie folgt aus:

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(); offensichtlich scheitert.

Was wäre der beste Weg zu überprüfen, ob viewCallback.doSomething(); erfolgreich aufgerufen wird. Sollte ich die onComplete irgendwie stubben? oder gibt es eine andere Möglichkeit, dies zu tun? Ich habe darüber nachgedacht, Firebase-Code hinter eine Schnittstelle zu setzen, kann aber immer noch nicht herausfinden, wie man überprüft, ob der Callback ausgelöst wird. Ich benutze Mockito zum Spotten.

+0

können Sie die Implementierung der Methode createUserWithEmailAndPassword hinzufügen? –

+0

auch, ist FirebaseAuth ein Singleton? –

+0

Das ist Teil der Firebase SDK, soweit ich sagen kann, ist der Code nicht öffentlich verfügbar. https://developers.google.com/android/reference/com/google/firebase/auth/FirebaseAuth.html#createUserWithEmailAndPassword(java.lang.String,%20java.lang.String) –

Antwort

0

Dies scheint eher ein Intergrationstest-Szenario zu sein.

Wenn Sie Unit-Test es wollen würde ich Folgendes tun:

Schritt 1) ​​

Erstellen Sie eine öffentliche Klasse mit dem Verhalten des Callbacks, stattdessen eine anonyme Klasse verwenden:

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

Schritt 2)

Ihre creat ändern eUser Methode:

public void createUser() { 

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

} 

Schritt 3)

definieren Ihr Test wie folgt:

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

Das Endergebnis ist, dass Ihre verifizieren, dass eine bestimmte Rückruf für die createUserWithEmailAndPassword Methode registriert ist .

Das ist alles, was Sie tun können, wenn Sie dies als Komponententest ohne tatsächlichen Aufruf von Framework-Code haben möchten.

+0

Danke für den Kommentar Ich habe eine funktionierende Lösung mit dem obigen Beispielcode gefunden :) –

Verwandte Themen