【问题标题】:Unit Testing with Mockito & Firebase使用 Mockito 和 Firebase 进行单元测试
【发布时间】:2019-04-27 14:52:18
【问题描述】:

我正在尝试对我正在构建的 Android 应用进行测试。其中一项测试涉及我编写的连接到 Google Firestore 的交互器文件 (DatabaseInteractor.java)。默认构造函数将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 ... //
}

【问题讨论】:

  • 发布您的 DatabaseInteractor.java 文件,您可能需要模拟 Firestore 实例
  • 发布了我的 DataBaseInteractor 文件!

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


【解决方案1】:

您需要在构造函数中注入 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
}

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

【讨论】:

  • 豪尔赫,谢谢你。您是否碰巧知道是否必须通过构造函数传递您在类中模拟的任何依赖项,或者这只是模拟 Firebase 对象的一个​​怪癖?
  • 您不必这样做,例如,您可以通过方法传递模拟。但你可能应该。一般来说,单元测试是指在没有外部依赖的情况下单独测试一段代码。在您的情况下,您想要测试交互器的功能是否有效,无论 Firestore 或任何其他依赖项的行为如何。您可以通过模拟所有依赖项来实现这一点,而简单(且干净)的方法是使用构造函数注入。
猜你喜欢
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多