Модульное тестирование с Mockito & Firebase - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь реализовать тестирование для приложения Android, которое я создаю.Один из тестов включает файл интерактора, который я написал (DatabaseInteractor.java), который подключается к Google Firestore.Конструктор по умолчанию устанавливает для объекта FirestoreFirebase значение FirebaseFirestore.getInstance();.

. Я использую Mockito & JUnit для своих модульных тестов.Когда я пытаюсь создать объект DataBaseInteractor в моем модульном тесте, я получаю следующую ошибку:

java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process null. Make sure to call FirebaseApp.initializeApp(Context) first.

Очевидно, эта ошибка возникает, когда конструктор по умолчанию вызывается в моем модульном тесте.Я не уверен, почему это происходит.Я могу создать объект DataBaseInteractor в других частях моего приложения для Android без проблем.Существуют ли ограничения в том, когда и где я могу инициализировать класс, который использует FireBaseFireStore объекты?Если я хочу высказать поведение FireBase для модульного тестирования, как мне обойти эти ограничения?

РЕДАКТИРОВАТЬ: усеченная версия моего DataBaseInteractor.java файла:

public class DatabaseInteractor {
    private static User theUser;
    private FirebaseFirestore db;
    private DocumentReference userData;


    public DatabaseInteractor() {
        db = FirebaseFirestore.getInstance();
        theUser = new User();
    }
 // ... various methods that add/retrieve Users from FireStore ... //
}

1 Ответ

0 голосов
/ 26 ноября 2018

Вам нужно добавить экземпляр FirebaseFirestore в ваш конструктор, чтобы его можно было смоделировать, например:

public class DatabaseInteractor {
    private static User theUser;
    private FirebaseFirestore db;
    private DocumentReference userData;


    public DatabaseInteractor(FirebaseFirestore firestore) {
        db = firestore
        theUser = new User();
    }
 // ... various methods that add/retrieve Users from FireStore ... //
}  

В вашем тесте вы можете смоделировать FirebaseFirestore с помощью Mockito:

@Test
public void someTest() {
  FirebaseFirestore mockFirestore = Mockito.mock(FirebaseFirestore.class)
  Mockito.when(mockFirestore.someMethodCallYouWantToMock()).thenReturn(something)

  DatabaseInteractor interactor = new DatabaseInteractor(mockFirestore)

  // some assertion or verification
}

Я бы посоветовал вам прочитать о внедрении зависимостей, это облегчит модульное тестирование, если вы сможете передавать макеты ваших зависимостей в конструктор вместо того, чтобы создавать их экземпляры внутри него.

...