2019-08-12 dexmaker-mockito-inline で final クラスを mock する
bouzuya/rust-atcoder abc114_c, abc115_c 。
2019-07-28 からの『 ABC の C 問題を 1 日 1 問解く勉強会 (仮) 』で 2 問。
mockito で ViewModel を mock しようとしたらエラーになった。 final クラスは mock できないそうだ。
val viewModel = mock(NumberPickersViewModel::class.java)
Kotlin は既定で final class になる。継承可能にする場合は open を明示しないといけない。別に継承したいわけじゃないんだけどテストのためにどうしようかと迷った。
mockito は final クラスも mock できるようになっているらしい。
/app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
に mock-maker-inline
とだけ書いたファイルを置くと良いらしいのだけど、動かない。
android-testing の例もそうなっている。ただこのプロジェクトは final クラスを mock していなさそうので気づいていないだけかもしれない。 https://github.com/googlecodelabs/android-testing/blob/codelab2019/app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
ほかの選択肢として all-open compiler plugin を使う手もある。
https://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin
既定で open にする or アノテーションで open にできるようにするらしい。テストのときだけできると良いのだけどそういうものではなさそう。
ぼくは結局 dexmaker-mockito-inline にした。
https://medium.com/androiddevelopers/mock-final-and-static-methods-on-android-devices-b383da1363ad
標準的じゃなさそうなので不安はあるけどとりあえず動いた……という段階。
https://github.com/bouzuya/android-number-pickers/commit/7a21076be1ea605242a09bfa043498bce0354edd