5

Я пытаюсь написать простой тест Robolectric для моего ведущего, который использует базу данных Firebase и Firebase Auth. Но каждый раз, когда я пытаюсь запустить тест, он выдает исключение IllegalStateException.Исследование Robolectric с использованием 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) 

Мой тест довольно прост

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

В то время как в моем ведущий конструктор я просто получить Firebase экземпляров.

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

Есть ли способ использования Robolectric с Firebase?

+0

Разве это не возможно, чтобы высмеивать firebase компоненты? вы хотите, чтобы они были в вашем тесте? –

+0

Нет, мне они еще не нужны. Не могли бы вы предоставить дополнительную информацию о том, как их издеваться? Я новичок в тестировании. – Prokky

ответ

4

Если вы не используете их в своем коде, чтобы проверить, можно вводить их конструктору:

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

и вы впрыснуть null для них, помните, что это очень плохой способ, используя null. . Лучше всего использовать библиотеку, например Mockito, или использовать интерфейсы/обертки и т. Д.

E.g. использовать интерфейс

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

LoginPresenter:

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

Нормальная реализация 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 ...; 
    } 
} 

И теперь очень легко издеваться базу данных с помощью IDatabase:

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

Вызывается из теста, как:

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

 Смежные вопросы

  • Нет связанных вопросов^_^