【问题标题】:How to mock a private function in android test with MockK?如何使用 MockK 在 android 测试中模拟私有函数?
【发布时间】:2018-09-25 17:47:34
【问题描述】:

我似乎无法在 android 测试中模拟私有函数。我还在使用全开放插件进行 pre-P 测试。在非安卓测试上,它运行没有问题。我认为它也应该在 android 上工作,因为它在 MockK-android 上被标记。这没有实施还是我遗漏了一些明显的东西?

androidTestImplementation "io.mockk:mockk-android:1.8.7"

@OpenForTesting
class A {
    fun publicFun() = privateFun()
    private fun privateFun() {}
    protected fun protectedFun() {}
}

@Test
fun privateFunctionMock() {
    val spy = spyk<A>()
    val mock = mockk<A>()
    val a = A()

    val functions = a::class.functions // size -> 6
    val spyFunctions = spy::class.functions // size -> 5
    val mockFunctions = mock::class.functions // size -> 5

    every { spy["privateFun"]() } returns Unit

    a.publicFun()
}


失败并出现异常,因为缺少私有函数。
io.mockk.MockKException: 找不到用于动态调用的函数 privateFun()

【问题讨论】:

    标签: kotlin android-testing mockk


    【解决方案1】:

    子类化用于为 pre-P android 仪器测试创建模拟和间谍。这意味着基本上会跳过私有方法,因为无法继承它们。这样计数器就不会计算私有方法。

    【讨论】:

    • 感谢您的快速回复。 mockk.io/ANDROID.html 上是否有错误,将 pre-P android 上的“私有函数模拟”标记为支持?感谢 MockK!
    【解决方案2】:
    InternalPlatformDsl.dynamicSet(autoBannerViewPagerMock, "mBannerList", list)
    every { autoBannerViewPagerMock.invoke("loadCoverImage") withArguments listOf(any<Int>(), any<Int>(), any<ImageView>(), any<stMetaBanner>()) } returns Unit
    

    【讨论】:

    • 它如何回答原来的问题?
    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2020-01-29
    • 2011-10-30
    • 2022-08-19
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多