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

如何測試 Static Method, Singleton

Joe Tsai
Joe Tsai
Sep 19, 2018 · 3 min read

前情提要

在 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

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

參考資料

Joe Blog

想到什麼寫什麼

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store