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

MockK 功能介紹:mockk, every, Annotation, verify

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

前情提要

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

  1. MockK 功能介紹:mockk, every, Annotation, verify(這篇)
  2. MockK 功能介紹:Relaxed Mocks, 再談 Verify , Capture
  3. 如何測試 Static Method, Singleton

MockK

MockK 是一款專門為 Kotlin 所設計的 Mocking Library,Mockito 能做到的事情它都做得到,Mockito 做不到的事情它也做得到,簡而言之 MockK 可以讓你無痛地在 Kotlin 下使用 Mockito 跟 PowerMock 的功能,它是一款完全獨立的套件,你不會需要引入 Mockito 或 PowerMock,更不會被兼容性的問題綁架。

Gradle Setting

首先,在 build.gradle(app) 加入以下設定:

dependencies {    testImplementation 'io.mockk:mockk:1.8.6'    ...}

Example: 小孩要零用錢

為方便講解,這邊會用小孩要零用錢這個案例來進行說明,每個小孩都會需要零用錢,通常小孩沒錢時就會跟媽媽要零用錢,於是我宣告了一個叫 Kid 的 Class:

mockk, every

接著對 wantMoney() 進行測試,測試代碼如下:

val mother = mockk<Mother>()
val kid = Kid(mother)
every { mother.giveMoney() } returns 30
// When
kid.wantMoney()
// Then
assertEquals(30, kid.money)

Annotation

MockK 跟 Mockito 一樣,也支援 Annotation 的方式進行初始化:

需求變更:必須通知媽媽

萬一媽媽現在變得很嚴格,規定小孩每次要零用錢的時候,都要先通知媽媽才行,於是我們修改一下 Kid Class,在 wantMoney() 中加上 mother.inform(money)

Verify

針對上面的情況來說,我們要確保的是:小孩要零用錢的時候,同時也有通知媽媽,於是將測試代碼改成如下:

verify { mother.inform(any()) }

MockKException: No answer found for: Mother(#1).inform(0)

接著運行一下測試代碼,你會得到這樣的訊息:

io.mockk.MockKException: no answer found for: Mother(#1).inform(0)
every { mother.inform(any()) } just Runs

Joe Blog

想到什麼寫什麼

Joe Blog

想到什麼寫什麼

Joe Tsai

Written by

Joe Tsai

Joe Blog

想到什麼寫什麼