我在一個使用通用頂級掛起函式的類中有一個函式。為了測驗這個函式,我需要模擬這個頂級函式,但到目前為止我還沒有找到一個好的解決方案。
可以說我有這個:
suspend fun <T> awesoneGenericFunction(block: suspend (Bool) -> T): T {
complicatedCode()
return otherAwesomeCode(block)
}
使用 mockk 可以通過執行以下操作來模擬靜態函式:
mockkStatic(::awesoneGenericFunction)
可悲的是,在這種情況下,這不起作用,因為awesoneGenericFunction它是通用的,并且編譯器抱怨缺少型別。我知道我也可以這樣做:
mockkStatic("pckg.FileWithGenericFunctionKt")
coEvery { awesoneGenericFunction <Boolean>(any()) } returns false
這是有效的,但這種方法感覺不對。硬連接包含通用函式的檔案(名稱)似乎將來可能會導致麻煩(例如,如果有人決定將函式移動到其他檔案,則此測驗將失敗。同樣在這種情況下,錯誤訊息會以某種方式誤導相信會讓人有些頭疼)。
是否可以僅模擬該功能而無需任何進一步的“接線”?
uj5u.com熱心網友回復:
這是一個適合我的解決方法。
val function: suspend (suspend (Boolean) -> Any) -> Any = ::awesomeGenericFunction
val kFunction = function as KFunction<*>
mockkStatic(kFunction)
它使用了兩個技巧:
- 我們可以通過為它定義一個顯式的函式型別來參考該函式,在這種情況下
suspend (suspend (Boolean) -> Any) -> Any。這意味著編譯器不必推斷泛型型別的值,因為它是作為函式型別的一部分提供的。 - 然后我們可以將該函式轉換為 a
KFunction<*>,因為它實際上是一個底層函式。這是一個實作細節,所以它有可能在未來的語言版本中停止作業。
因為這個技巧涉及為函式創建一個顯式簽名,所以我想不出一種方法來制作一個可以模擬任何通用函式的通用助手。每個函式的代碼都需要根據其函式簽名而有所不同。
有一個開放的 YouTrack 問題允許對具有泛型型別引數的函式進行正確的函式參考,這將消除對解決方法的需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/524063.html
標籤:科特林测试仿制药嘲弄模拟
