android - 使用 Mockito 和 Firebase 进行单元测试

标签 android firebase unit-testing mockito google-cloud-firestore

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

相关文章:

javascript - Firebase Javascript 网络错误

node.js - 从 Firebase Cloud Functions 将数据发送回 Android

Firebase 存储安全规则

java - 验证所有方法调用中的 Collection 参数是否一起包含给定集合中的所有值

java - Jenkins 上的随机构建失败

C# 模拟具体类。如何?

Java Paho MQTT 检测重连

java - 单击通知时如何打开 Activity

android - 由于 Lollipop 中的 'void dalvik.system.CloseGuard.close()' 导致的 NullPointerException

android - 移动浏览器或应用程序中不显示 Unicode 粗体字符