5

Sto provando a scrivere un semplice test Robolectric per il mio relatore, che utilizza il database Firebase e l'autenticazione Firebase. Ma ogni volta che cerco di iniziare il test, lancia un IllegalStateException.Test dell'app Robolectric con Firebase

java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist. 
    at com.google.firebase.FirebaseApp.getInstance(Unknown Source) 
    at com.google.firebase.FirebaseApp.getInstance(Unknown Source) 
    at com.google.firebase.auth.FirebaseAuth.getInstance(Unknown Source) 

Il mio test è molto semplice

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class LoginPresenterTest { 
    private LoginPresenter presenter; 
    private LoginMvpView view; 

    @Before 
    public void beforeEachTest() { 
     presenter = new LoginPresenter(); 
     view = new LoginFragment(); 
    } 

    @Test 
    public void attachView_shouldAttachViewToThePresenter() { 
     presenter.attachView(view); 
     assertSame(presenter.getMvpView(), view); 
    } 
} 

Mentre nel mio costruttore presentatore ottengo solo le istanze Firebase.

public LoginPresenter() { 
     this.firebaseAuth = FirebaseAuth.getInstance(); 
     this.database = FirebaseDatabase.getInstance().getReference(); 
    } 

C'è un modo per utilizzare Robolectric con Firebase?

+0

Non è possibile prendere in giro i componenti Firebase? li vuoi nel tuo test? –

+0

No, non ho ancora bisogno di loro. Potresti fornire maggiori informazioni su come prenderli in giro? Sono nuovo al test. – Prokky

risposta

4

Se non vengono utilizzati nel codice per testare è possibile iniettare loro da costruttore:

public LoginPresenter(FireBaseAuth firebaseAuth, FirebaseDatabase database){ 
    this.firebaseAuth = firebaseAuth; 
    this.database = database; 
} 

e si inietta null per loro, ricordate che questo è un modo molto povera utilizzando null. Il modo migliore è usare una libreria come Mockito o usare interfacce/wrapper, ecc.

E.g. utilizzare un'interfaccia

public interface IDatabase { 
    public List<String> getData(); 
} 

Il LoginPresenter:

public LoginPresenter(FireBaseAuth firebaseAuth, IDatabase database){ 
    this.firebaseAuth = firebaseAuth; 
    this.database = database; 
} 

La normale attuazione del IDatabase:

public class MyDatabase implements IDatabase { 

    private FirebaseDatabase database; 

    public MyDatabase(FirebaseDatabase database) { 
     this.database = database; 
    } 

    public List<String> getDate() { 
     // Use the FirebaseDatabase for returning the getData 
     return ...; 
    } 
} 

E ora è molto facile da prendere in giro il database utilizzando il IDatabase:

public class DatabaseMock implements IDatabase { 
    public List<String> getData() { 
     // Return the expected data from the mock 
     return ...; 
    } 
} 
.210

Chiamatelo dal test come:

presenter = new LoginPresenter(FirebaseAuth.getInstance(), new DatabaseMock());