読者です 読者をやめる 読者になる 読者になる

ichily.blog

{ "${it} is always there :)" }

KotlinでMockitoを使うだけの話

概要

Kotlin使ったらMockitoさんがキレたのでMockMackerプラグインを入れた。

経緯と詳細

最近Androidアプリ開発でうだうだしているので触っているKotlin。良い感じなのだが、すべてのクラス・メソッドがfinalになるのでMockitoさんがキレる。

Mockito cannot mock/spy following:
  - final classesMockito cannot mock/spy following:
  - final classes
    ...

もーヒートアップしないでくださいよ。

Webでこの話を追うと、当初この問題で行われたアプローチが3つ。

  • クラスを全部 open にする
    テストのためだけにコード変更するのやだなあ

  • インターフェースにしよう
    テストのためだけにコード変更するのやだなあ

  • PowerMock使え
    Mockito2以降への対応が今一つでゴリゴリ例外が飛んでくるやだなあ

という感じでTestRunnerを拡張して解決する人が現れ、そうこうするうちにMockitoがMockMakerというのを実装した(Mockito 2.1以降?)のでこれを使うのがよさげ、という流れっぽい。

dependencies {
    ...
    testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:2.7.15'
    androidTestCompile 'org.mockito:mockito-android:2.7.15'
    ...
}

こんなんで。

あと、test/resources/mockito-extensions/org.mockito.plugins.MockMakerというファイルに公式サイトにある通り書き込んで保存。
What’s new in Mockito 2 · mockito/mockito Wiki · GitHub

うまくいくので、PowerMockが使われているプロジェクトをKotlinに変換してみたらしんでしまった。なんだっけ、Could not copy test/resources/mockito-extensions/org.mockito.plugins.MockMaker to build/...みたいなこと言ってた気がする。後で何とかしよう、まずは軽率に例外を投げるPowerMockとMockito2.xのペアを泣き別れさせるべくPowerMock部分を全部削って*1、、とかやっているうちに動くようになってしまった。なんで。

切り分けは気が向いたら。

その後

素直に動いているっぽい。

恐怖のアフィリエイト

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

*1:そしてなぜか全部削れてしまう