bouzuya.hatenablog.com

ぼうずやのにっき

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.MockMakermock-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