[英]How to mock Build.VERSION.SDK_INT using mockk
How can I mock Build.VERSION.SDK_INT in mockk?如何在 mockk 中模拟 Build.VERSION.SDK_INT?
I've done the following:我做了以下工作:
@Test
fun testFoo(){
mockkStatic(Build::class)
mockkStatic(Build.VERSION::class)
every {
Build.VERSION.SDK_INT
} answers { 22 }
}
I end up getting io.mockk.MockKException: Missing calls inside every { ... } block.
我最终得到io.mockk.MockKException: Missing calls inside every { ... } block.
once the code hits the every
block.一旦代码命中every
块。
You can build a wrapper around the Build config like this您可以像这样围绕 Build 配置构建一个包装器
object MyAppBuildConfig {
fun getVersionSDKInt(): Int {
return Build.VERSION.SDK_INT
}
}
Then mock the MyAppBuildConfig with mockkObject and return your desire version number然后用 mockkObject 模拟 MyAppBuildConfig 并返回您想要的版本号
mockkObject(MyAppBuildConfig)
every { MyAppBuildConfig.getVersionSDKInt() } returns 22
I ended up modifying Build.VERSION.SDK_INT
using reflection.我最终使用反射修改了Build.VERSION.SDK_INT
。 I added the following helper:我添加了以下助手:
private fun setStaticFieldViaReflection(field: Field, value: Any) {
field.isAccessible = true
Field::class.java.getDeclaredField("modifiers").apply {
isAccessible = true
setInt(field, field.modifiers and Modifier.FINAL.inv())
}
field.set(null, value)
}
and then called it like this in my test:然后在我的测试中这样称呼它:
setStaticFieldViaReflection(Build.VERSION::class.java.getField("SDK_INT"), 23)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.