簡體   English   中英

Mocking 用 Mockk 調用 JNI 的方法

[英]Mocking methods that call JNI with Mockk

我正在嘗試向現有的 Android 應用程序添加單元測試,該應用程序具有一些 JNI 庫(僅適用於 ARM)。 我正在使用MockkJunit4 ,並且我有以下內容:

這個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM