[英]Mocking methods that call JNI with Mockk
我正在嘗試向現有的 Android 應用程序添加單元測試,該應用程序具有一些 JNI 庫(僅適用於 ARM)。 我正在使用Mockk
和Junit4
,並且我有以下內容:
這個 static class 是我的,它調用了外部 SDK 的initialize
方法(這是我得到的,我無權訪問他們的代碼)。
internal class DeviceSDK {
companion object {
internal fun initialize() {
val success = ExternalSDK.getInstance().init() // it fails here 2
return success
}
}
}
init
方法為某些本機庫調用loadLibrary
。
在我的測試 class 中,我有以下內容:
class MyDeviceTest {
private val sdkInstance = mockk<ExternalSDK>()
@Before
fun setUp() {
mockkStatic(ExternalSDK::class) {
every { ExternalSDK.getInstance() } returns sdkInstance
}
every { sdkInstance.init() } returns true
mockkStatic(DeviceSDK::class) {
every { DeviceSDK.initialize() } just runs // it fails here 1
}
}
...
}
這在我放it fails here 1
條評論,因為它調用了我把it fails here 2
評論,並且它試圖加載庫,給我一個UnsatisfiedLinkError
。
但我真的不明白為什么,因為首先我是 mocking 方法DeviceSDK.initialize()
所以它不應該運行。 但如果它運行了,無論如何我是 mocking ExternalSDK init
方法,所以它不應該運行。
有什么我做錯了嗎? 謝謝你。
最后,問題是因為 Kotlin 中的companion objects
實際上不是 static 類,即使它們完成相同的事情。 所以你必須為mockkObject
更改mockkStatic
然后它不會調用 SDK。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.