首页 > 解决方案 > 使用 Dagger2 进行仪器测试 - 如何引用假存储库?

问题描述

我的目标是用 Espresso 测试一个应用程序。

第一个屏幕活动取决于从存储库接收的设置。存储库检查用户是否在共享首选项中保存了位置首选项。如果他有,它会转到主要活动。这就是我要测试的逻辑部分。

我想用伪造的存储库(代表共享偏好的 HashMap)来实现一致性。如果存储库为空(基本状态),则测试运行并通过。但是,如果保存位置,我想测试应用程序是否向前移动。

有问题的测试:

@Test
fun onLaunch_withLocationSaved_checkMainActivityIsShown() {
    fakeRepository.saveLocation("40,80")

    ActivityScenario.launch(FirstScreenActivity::class.java)
    onView(withText(R.string.welcome_message)).check(matches(not(isDisplayed())))
}

如何获取对 fakeRepository 的引用,以便能够保存 ViewModel 将从中读取的位置?

如果它是这样创建的(这会破坏注入点):

@Before
fun init() {
    fakeRepository = FakeSimpleRepository()
    fakeRepository.saveLocation("")
    viewModel = FirstScreenViewModel(fakeRepository)
}

视图模型被注入了不同的 fakeRepository 对象(我将地址与调试器进行了比较)。

我遵循了 Google 的代码实验室和官方文档,了解如何使用我的应用设置 Dagger。他们的示例没有显示如何引用存储库来进行更改。

标签: androiddagger-2android-mvvm

解决方案


博客涵盖了您想要实现的目标

这个想法是你必须重写你的匕首模块来注入模拟对象。然后创建一个自定义运行器类来覆盖应用程序类。


推荐阅读