我正在尝试对我正在构建的 Android 应用程序进行测试。其中一项测试涉及我编写的连接到 Google Firestore 的交互器文件 (DatabaseInteractor.java
)。默认构造函数将 FirestoreFirebase
对象设置为 FirebaseFirestore.getInstance();
。
我正在使用 Mockito 和 JUnit 进行单元测试。当我尝试在单元测试中创建 DataBaseInteractor 对象时,出现以下错误:
java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process null。确保先调用 FirebaseApp.initializeApp(Context)。
显然,在我的单元测试中调用默认构造函数时会发生此错误。我不确定为什么会这样。我可以毫无问题地在我的 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 ... //
}
最佳答案
您需要在构造函数中注入(inject) 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 ... //
}
在您的测试中,您可以使用 Mockito 模拟 FirebaseFirestore
:
@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
}
我建议您阅读有关依赖注入(inject)的内容,如果您可以在构造函数中传入依赖项的模拟而不是在其中实例化它们,这将使单元测试变得容易得多。
关于android - 使用 Mockito 和 Firebase 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53473006/