MockK:一款強大的 Kotlin Mocking Library (Part 4 / 4)

如何測試 Static Method, Singleton

前情提要

在 Java 的世界裡面,說到單元測試,不得不提到 Mockito,它是目前 Java 最多人使用的 Mocking framework,但若來到 Kotlin 的世界呢?我們還能仰賴 Mockito 進行單元測試嗎?有沒有專門為 Kotlin 這款語言量身打造的 Mocking framework 呢?

這系列文章會手把手教你如何使用 MockK,讓你了解它好用的地方在哪裡?以及它解決了什麼樣的問題?一共分成 4 篇文章,包括以下內容:

  1. 用 Kotlin + Mockito 寫單元測試會碰到什麼問題?
  2. MockK 功能介紹:mockk, every, Annotation, verify
  3. MockK 功能介紹:Relaxed Mocks, 再談 Verify , Capture
  4. 如何測試 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

有興趣的朋友再到官網上玩看看囉!

參考資料