【逆引き】 kotlinで使うMockKの使い方

【逆引き】 kotlinで使うMockKの使い方

テスト用ライブラリのMockKを用途から索引できるようにまとめます。

classをmockにして戻り値で受け取る

Docs: DSL examples
classとして宣言しているファイルをmockし、mockされたインスタンスを受け取ります。
受け取ったmockインスタンスをテスト実行するコードに引数で渡して使用する場合に使います。

class Person {
    fun getName() : String {
        return "Ichiro"
    }
}

val person = mockk<Person>()
every {
    person.getName()
} returns "Jiro"

テストコード内でインスタンス生成するclassをmockする

Docs: Constructor mocks
classとして定義しており、プロジェクションコード内でインスタンス生成しているclassをmockにします。

class Person {
    fun getName() : String {
        return "Ichiro"
    }
}

val person = mockkConstructor(Person::class)
every {
    anyConstructed<>(Person).getName()
} returns "Jiro"

objectをmockする

Docs: Object mocks
Singletonで定義してくれるkotlinのobjectをmockにします。

object Person {
    fun getName() : String {
        return "Ichiro"
    }
}

val person = mockkObject(Person)
every {
   Person.getName()
} returns "Jiro"

拡張関数をmockする

Docs: Extension functions
Stringクラスに .ToJson()などと関数を追加できる拡張関数をmockにします。

class Person {
    fun getName() : String {
        return "Ichiro"
    }
}

--- fullpath: pkg.application.util.test.kt

fun Person.getAge() : Int {
    return 20
}

---
val person = mockkStatic("pkg.application.util.testkt")
every {
   Person.getAge()
} returns 30

private関数をmockする

Docs: Private functions mocking / dynamic calls
private関数をmockにしなければならない場合は recordPrivateCalls 引数に true を指定します。

class Person {
    fun getName() : String {
        return "Ichiro"
    }

    private fun anyPrivateFunc(name: String) : String {
        return name
    }
}

val person = mockk<Person>(recordPrivateCalls = true)
every {
    person["anyPrivateFunc"](anyAny<String>())
} returns "Jiro"

verify {
    person["anyPrivateFunc"](anyAny<String>())
}

mockを解除する

Docs: Top level functions
Constructor mockやStatic mock, Object mockは解除する必要があります。
テストケース実行後に自動的に元に解除されることはなく、mockに一致する関数を呼び出している場合にmockに置き換わります。

unmockkAll()

mockがcallされた回数を検証する

Docs: Capturing
mock関数がcallされた回数を検証します。

class Person {
    fun getName() : String {
        return "Ichiro"
    }
}

val person = mockk<Person>()
every {
    person.getName()
} returns "Jiro"

verify {
    person.getName()
}

verifyはmock関数が1回callされているか検証します。

mockがcallされた回数を検証する (詳細)

callされる回数やcallされる回数がN回以上、N回以下を指定して検証します。

class Person {
    fun getName() : String {
        return "Ichiro"
    }
}

val person = mockk<Person>()
every {
    person.getName()
} returns "Jiro"

verify { person.getName() } // 1回
verify(exactly = 5) { person.getName() } // 5回
verify(exactly = 0) { person.getName() } // 0回 = 1回もcallされないこと
verify(atLeast = 2) { person.getName() } // 2回以上
verify(atMost  = 3) { person.getName() } // 3回以下

プログラミングカテゴリの最新記事