どっこと備忘録群

アウトプットしないとインプットできない私が Androidアプリ開発をメインとした備忘録を載せています。

mockito-kotlinを扱う

mockito-kotlinを扱う意義

CI/CD(継続的インテグレーション/継続的デリバリー)の重要性が高まる中、テストコードの実装も重要性があがっている。 単体テストを実装する上で必須のテクニックとなるのがモック化(Mocking)

モック化とは、テスト対象の機能が依存している他の機能(依存オブジェクト)の影響を受けないようにするためにあらかじめその依存オブジェクトに固定の値を返させたり特定の振る舞いをさせるように設定しておくこと。これによりテストが安定し、不必要な結合が排除された疎結合なテストコードを実装できる。

mockito-kotlinは、Javaで広く使われているモックフレームワーク Mockito をKotlinで簡単に利用できるようにするライブラリ。

build.gradleに依存関係を追加

build.gradledependenciesに以下を追記します。単体テスト用なのでtestImplementationスコープで追加する。

dependencies {
  testImplementation "org.mockito.kotlin:mockito-kotlin:5.3.1"
}

それでは、mockito-kotlinを使ったモック化の実装方法を解説します。

1. 戻り値の固定化

特定のメソッドが呼び出されたときに、固定の値を返すように設定する。

mock関数でモックオブジェクトを生成し、on { メソッド() } doReturn 戻り値の形式で振る舞いを定義する。

// Sampleクラスのモックを作成し、sample()が呼ばれたら "sample" を返すように設定
val mock = mock<Sample> {
    on { sample() } doReturn "sample"
}

2. 例外を投げる

メソッドが呼ばれた時に特定の例外をスローするモックの実装は、doThrowで例外を指定する。

// sample()が呼ばれたら IllegalStateException をスローするように設定
val mock = mock<Sample> {
    on { sample() } doThrow IllegalStateException()
}

3. 振る舞いの指定

メソッドが呼ばれた時に、より複雑な処理(例:引数を使った演算や状態の変更など)を実行させる場合は、doAnswerを使用する。

// sample()が呼ばれた時に、特定の処理(ここではコメントのみ)を実行するように設定
val mock = mock<Sample> {
    on { sample() } doAnswer {
        // do anything. (具体的な振る舞いロジック)
    }
}

最終更新: 2025.9.28