0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Android】Mockito vs MockK 比較整理

Posted at

はじめに

Android / Kotlin 開発において、テストでよく使われるモックライブラリが MockitoMockK です。
両者は目的こそ同じですが、設計思想や 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 にない部分)

  • mockkObjectobject シングルトン を直接モック可能
  • 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 機能との相性が良い
  • プロジェクトの性質に合わせて使い分けるのがベスト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?