それがいいことの序章です

楽しいことならいっぱい夢見ることならめいっぱい

MockKを使ってて便利だった関数たち

MockKにお世話になっていて、便利だった関数をいくつかご紹介します。

confirmVerified

verifyですべての呼び出しが検証されたかをチェックすることができます。

たとえば「ボタンがクリックされたときにアナリティクスイベントを記録する」という挙動をテストしたいというケースで、このようにテストを書いたとします。(ViewModelでクリックイベントをハンドリングしたとする)

val analytics: AnalyticsManager = mockk(relaxed = true)
// テスト対象を生成
val viewModel: HogeViewModel = createViewModel(analytics = analytics)
viewModel.onClickButton()

verify(exactly = 1) {
    analytics.logCustomEvent(Event.TapButton)
}
// analyticsの呼び出しすべてを検証したかをチェック
confirmVerified(analytics)

このとき、HogeViewModel#onClickButtonを呼び出した際にanalyticsに対してverifyで検証したもの以外の呼び出しがあったときに、confirmVerifiedは例外をスローしてくれます。

予期せぬ呼び出しがないかや、検証の漏れがないかという場合に便利です。

ofType

マッチャーのひとつで、値の型をチェックすることができます。

通常の検証ではeq(value)が使われますが、ものによってはequalsの比較の検証が難しい場合もあります。

val analytics: AnalyticsManager = mockk(relaxed = true)
// テスト対象を生成
val viewModel: HogeViewModel = createViewModel(analytics = analytics)
viewModel.onClickSave()

verify(exactly = 1) {
    // Event.Saveという型のイベントが記録されたことを検証
    analytics.logCustomEvent(ofType(Event.Save::class))
}

このように書くと、AnalyticsManager#logCustomEventに渡したパラメータがEvent.Saveであることを検証できます。

withArg

こちらもマッチャーの一つで、検証するパラメータについてコードの実行が可能なため、ofTypeより’柔軟に検証することができます。
こちらはMockKVerificationScope内でのみ使うことができます。

val analytics: AnalyticsManager = mockk(relaxed = true)
// テスト対象を生成
val viewModel: HogeViewModel = createViewModel(analytics = analytics)
viewModel.onClickSave()

verify(exactly = 1) {
    // 引数についてAssertで詳細に検証
    analytics.logCustomEvent(withArg { event: Event ->
        Assert.assertEquals(1234, event.params["user_id"])
        Assert.assertEquals("hoge", event.params["type"])
    })
}

メソッド呼び出しの引数についてテストしたい場合に便利です。