使用 Mockito 和 Firebase 进行单元测试

Chr*_*s T 7 android unit-testing mockito firebase google-cloud-firestore

我正在尝试对我正在构建的 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.

显然,在我的单元测试中调用默认构造函数时会发生此错误。我不确定为什么会这样。我能够在我的 android 应用程序的其他部分创建一个 DataBaseInteractor 对象而不会出现问题。我可以在何时何地初始化利用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 ... //
}
Run Code Online (Sandbox Code Playgroud)

Jor*_*Gil 7

您需要在构造函数中注入 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 ... //
}  
Run Code Online (Sandbox Code Playgroud)

在您的测试中,您可以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
}
Run Code Online (Sandbox Code Playgroud)

我建议您阅读有关依赖项注入的内容,如果您可以在构造函数中传入依赖项的模拟而不是在其中实例化它们,那么单元测试将变得更加容易。