前情提要
在 Java 的世界裡面,說到單元測試,不得不提到 Mockito,它是目前 Java 最多人使用的 Mocking framework,但若來到 Kotlin 的世界呢?我們還能仰賴 Mockito 進行單元測試嗎?有沒有專門為 Kotlin 這款語言量身打造的 Mocking framework 呢?
這系列文章會手把手教你如何使用 MockK,讓你了解它好用的地方在哪裡?以及它解決了什麼樣的問題?一共分成 4 篇文章,包括以下內容:
- 用 Kotlin + Mockito 寫單元測試會碰到什麼問題?
- MockK 功能介紹:mockk, every, Annotation, verify
- MockK 功能介紹:Relaxed Mocks, 再談 Verify , Capture
- 如何測試 Static Method, Singleton(這篇)
mockkStatic
為了方便講解,我們建了一個叫 Util 的 Class:
它裡面有個 ok 方法,會分別呼叫 UtilJava.ok()
跟 UtilKotlin.ok()
。
- UtilJava 是一個 Java Class,它有個 static 的 ok 方法,回傳字串
UtilJava.ok()
- UtilKotlin 是 Kotlin 寫 static method 的其中一種方式,它的 ok 方法會回傳字串
UtilKotlin.ok()
接下來用 mockkStatic
對這段程式碼進行測試:
mockkStatic
UtilJava 跟 UtilKotlin 這兩個 Class,並改變這兩個 Static 方法的回傳值,最後驗證是不是有呼叫到這兩個方法,以及他們的回傳值是否被改變了。
mockkObject
如果 UtilKoltin 改成 Companion object 的寫法呢?
這時候則要用 mockkObject
:
mockkObject 參數可以傳入 UtilKotlin
或是 UtilKotlin.Companion
,Compiler 會自己找到 Companion。
至於為什麼是用 mockkObject
呢?如果你把上面這段程式碼 decompile 成 Java bytecode,你會發現 UtilKotlin.ok() 其實是被 delegate 給 companion object 去執行的:
Singleton
我們再次修改一下 UtilKotlin,把它變成 Singleton:
上面用了 object 的宣告,測試就直接使用 mockkObject
:
其他操作如同前面,就不贅述囉!
這系列文章已到尾聲,其實 MockK 還有很多功能:
- Spy
- Extension functions
- Private functions
- Coroutines
- …
有興趣的朋友再到官網上玩看看囉!