如何使用 MockK 在 android 测试中模拟私有函数?
How to mock a private function in android test with MockK?
我似乎无法在 android 测试中模拟私有函数。我还使用全开插件进行 pre-P 测试。在非 android 测试中它运行没有问题。我想它也应该在 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()
子类化用于为 pre-P android 仪器化测试创建模拟和间谍。这意味着基本上跳过私有方法,因为不可能继承它们。这样计数器就不会计算私有方法。
InternalPlatformDsl.dynamicSet(autoBannerViewPagerMock, "mBannerList", list)
every { autoBannerViewPagerMock.invoke("loadCoverImage") withArguments listOf(any<Int>(), any<Int>(), any<ImageView>(), any<stMetaBanner>()) } returns Unit
我似乎无法在 android 测试中模拟私有函数。我还使用全开插件进行 pre-P 测试。在非 android 测试中它运行没有问题。我想它也应该在 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()
子类化用于为 pre-P android 仪器化测试创建模拟和间谍。这意味着基本上跳过私有方法,因为不可能继承它们。这样计数器就不会计算私有方法。
InternalPlatformDsl.dynamicSet(autoBannerViewPagerMock, "mBannerList", list)
every { autoBannerViewPagerMock.invoke("loadCoverImage") withArguments listOf(any<Int>(), any<Int>(), any<ImageView>(), any<stMetaBanner>()) } returns Unit