MockKによるモック
依存関係をモックします
「MockKによるモック」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
MockKとは何ですか
MockKはKotlin向けに構築されたモックライブラリです。依存関係の偽物を作成し、クラスを分離してテストできるようにします。
- Kotlinの機能(オブジェクト、拡張、コルーチン)を第一級でサポートします
- スタブと検証のための読みやすいDSLを提供します
MockKの追加
テスト用の依存関係としてMockKを追加します。
dependencies {
testImplementation("io.mockk:mockk:1.13.11")
}モックの作成
mockk<Type>()を使ってモックを作成します。デフォルトではメソッドにスタブが設定されていないため、呼び出すと失敗します。
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()everyによるスタブ設定
every { } returns ...を使って動作を定義します。これにより、特定の呼び出しに対してモックが返す値を指定できます。
import io.mockk.every
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()
// every { repo.find(1) } returns "Ada"呼び出しの検証
verify { }を使って、メソッドが呼び出されたことをアサーションします。呼び出し回数を正確に指定することもできます。
import io.mockk.verify
// verify { repo.find(1) }
// verify(exactly = 2) { repo.find(any()) }
// verify(exactly = 0) { repo.find(99) }引数マッチャー
any()、eq()、match { }などのマッチャーを使うと、スタブや検証を柔軟にできます。
import io.mockk.every
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()
// every { repo.find(any()) } returns "X"
// every { repo.find(match { it > 10 }) } returns "big"Relaxedモック
relaxedモックは、スタブが設定されていない呼び出しに対して、妥当なデフォルト値(0、空文字列など)を返します。そのため、すべての呼び出しにスタブを設定する必要がありません。
import io.mockk.mockk
interface Logger { fun log(msg: String) }
val logger = mockk<Logger>(relaxed = true)引数のキャプチャ
capture()とslotを使うと、モックされたメソッドに渡された正確な引数を調べることができます。
import io.mockk.slot
import io.mockk.verify
val msgSlot = slot<String>()
// verify { logger.log(capture(msgSlot)) }
// println(msgSlot.captured)スパイ
spykは実際のオブジェクトをラップします。スタブを設定しない限り、実際のメソッドが実行されます。一部だけをモックしたい場合に便利です。
import io.mockk.spyk
class Calc { fun square(n: Int) = n * n }
val calc = spyk(Calc())
// real square runs; you can still verify { calc.square(3) }モックからの例外スロー
メソッドが例外をスローするようにスタブを設定すると、エラー処理の経路をテストできます。
import io.mockk.every
import io.mockk.mockk
interface Repo { fun find(id: Int): String }
val repo = mockk<Repo>()
// every { repo.find(0) } throws NoSuchElementException()後片付け
@AfterEachでclearAllMocks()を呼び出すか、JUnit5のMockKExtensionを使用して、テスト間でモックの状態をリセットし、状態の漏れを防ぎます。
import io.mockk.clearAllMocks
import org.junit.jupiter.api.AfterEach
class ServiceTest {
@AfterEach
fun tearDown() { clearAllMocks() }
}簡単な確認
多くのメソッドを持つモックがありますが、関心があるのは1つだけです。スタブが設定されていないメソッドには無害なデフォルト値を返したいとします。何を作成すればよいでしょうか。
まとめ
MockKを使うと、テスト対象のコードを分離できます。
mockk()でモックを作成し、every { } returnsでスタブを設定しますverify { }でやり取りを確認します- マッチャー、
slotによるキャプチャ、spyk、Relaxedモックを使用できます - テスト間で
clearAllMocks()を呼び出します
次はコルーチンのテストです。
よくある質問
「MockKによるモック」レッスンは無料ですか?
はい。「MockKによるモック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「MockKによるモック」で何を学びますか?
依存関係をモックします ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「MockKによるモック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JUnit5でテストを書く
- アサーション
- MockKによるモック
- コルーチンのテスト