はじめに
Android / Kotlin 開発において、テストでよく使われるモックライブラリが Mockito と MockK です。
両者は目的こそ同じですが、設計思想や Kotlin との相性に違いがあります。
1. 基本的な違い
項目 | Mockito | MockK |
---|---|---|
出自 | Java 発 | Kotlin 発(Kotlin-first) |
Kotlin 対応 |
mockito-kotlin を併用 |
Kotlin を前提に設計 |
final / data class |
mockito-inline が必要 |
標準で対応 |
コルーチン |
whenever {} で書けるがやや冗長 |
coEvery / coVerify が自然 |
拡張関数 | 基本的に不可 |
mockkStatic で可能 |
object / シングルトン | PowerMock など追加ツール必要 |
mockkObject で直接対応 |
学習コスト | 低い(Java 開発者に馴染みやすい) | やや高いが Kotlin 的に直感的 |
エコシステム | 歴史が長く資料豊富 | Kotlin 界隈で人気上昇中 |
2. Gradle 依存関係(JUnit5 前提)
Mockito
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
testImplementation("org.mockito:mockito-core:5.12.0")
testImplementation("org.mockito.kotlin:mockito-kotlin:5.4.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")
}
tasks.withType<Test> { useJUnitPlatform() }
MockK
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
testImplementation("io.mockk:mockk:1.13.11")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")
}
tasks.withType<Test> { useJUnitPlatform() }
3. コード比較
Mockito
interface UserRepository { suspend fun fetch(): String }
class UserVm(private val repo: UserRepository) {
suspend fun greet() = "Hello, ${repo.fetch()}"
}
@Test
fun `greet contains user name (Mockito)`() = runTest {
val repo = mock<UserRepository>()
whenever(repo.fetch()).thenReturn("Anna")
val vm = UserVm(repo)
assertEquals("Hello, Anna", vm.greet())
}
MockK
interface UserRepository { suspend fun fetch(): String }
class UserVm(private val repo: UserRepository) {
suspend fun greet() = "Hello, ${repo.fetch()}"
}
@Test
fun `greet contains user name (MockK)`() = runTest {
val repo = mockk<UserRepository>()
coEvery { repo.fetch() } returns "Anna"
val vm = UserVm(repo)
assertEquals("Hello, Anna", vm.greet())
coVerify(exactly = 1) { repo.fetch() }
}
4. MockK の強み(Mockito にない部分)
-
mockkObject
で object シングルトン を直接モック可能 -
mockkConstructor
で コンストラクタ呼び出し をモック可能 -
mockkStatic
で 拡張関数 / static メソッド をモック可能 - Kotlin コルーチンに自然な
coEvery / coVerify
記法
5. 選び方の指針
-
Kotlin 中心 / Coroutines / Flow 多用 / object・拡張関数を扱う
→ MockK が有利 -
既存 Java コード資産が多い / 社内標準が Mockito
→ Mockito 継続が無難 -
混在プロジェクト
→ Unit Test(Kotlin 部分)は MockK、レガシー部分は Mockito と 併用 もアリ
まとめ
- Mockito:歴史が長く Java 向け、既存資産が多い環境で強い
- MockK:Kotlin-first で直感的、Coroutines や Kotlin 機能との相性が良い
- プロジェクトの性質に合わせて使い分けるのがベスト