如何在仪器测试期间模拟应用程序使用的库的 class?

How to mock a class of a library used by the app during instrumented test?

我正在开发一个 Android 库,我正在使用 UI Automator 和 Mockk 为其编写一个仪器测试。

该库有一个名为 InstallManager 的 class,它将在设备上安装东西。我希望 InstallManager 抛出异常,以便我可以测试是否会显示错误通知。

我所做的就是找到“更新(安装)”按钮并单击它

        val updateButtonComponent = device.findObject(By.text(updateButtonText))
        updateButtonComponent.click()

如何mock/manipulate 库在自动化测试期间使用的 InstallManager


我试过的:

我尝试在 运行 自动化测试之前模拟 InstallManager,希望 UI Automator 神奇地知道它应该使用这个模拟的 InstallManager。但是(正如我已经想到的那样)它不是那样工作的...

private fun breakInstallManager() {
        installManager = spyk(InstallManager(mockk(relaxed = true), nonExistentFile))
        every { installManager.getString(any()) } returns ""
        every { installManager.packageName } returns ""
    }

要在 android 测试中模拟 InstallManager class,请调用 MockKAnnotations.init 方法。然后在测试方法中你可以指定return值

    @RelaxedMockK
    private lateinit var installManager: InstallManager

    @Before
    fun setUp() {
        MockKAnnotations.init(this)
        // …
    }
    
    @Test
    fun installManagerTest(){
        every { installManager.getString(any()) } returns ""
        every { installManager.packageName } returns ""
        // …
    }