Android + Kotlin + Mockito のメモ書き
Kotlin大好きで、Korlin最高だよって言いまくってるんですけど、Kotlinのつらみみたいな部分も残しておかないとフェアじゃないかなと思ったので残しておきます。
Instrument Testがつらい
実機だったりエミュレータ上で実行するAndroid Instrument Testがつらいです。なぜかというとKotlinは基本的にクラスがデフォルトでfinalになるからです。
Auto testはみなさん大抵mockitoを使うと思います。mockito 2.0 からfinal classもmockできるようになりましたが、こちらの機能はopt in機能で素の(Androidではない) Java では src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
のパスに以下の1行を書いたファイルをおけば動くようになります。
mock-maker-inline
ところがAndroidのJVMだとこちらのopt inがうまく機能しません。
mockito-androidに期待したでしょ?
mockito-androidがmockito 2.6.1 から出て来ました。こちらでdexmakerとの依存から解放されると喜んでいる皆さん、残念ながらinline mock makerは対象外です\(^o^)/
Be aware that you cannot use the inline mock maker on Android due to limitations in the Android VM.
最終手段All Open
Kotlin 1.0.6からcompile pluginでall openが追加されました。
こちらを利用するとclassに open
修飾子をつけなくても特定のアノテーションをつけたクラスがopenになります。
blog.jetbrains.com
ただし、Test compile時だけこの機能を有効にする方法が見つからず、結局productionに導入するのは諦めました。
テスト時だけ動くようなGradle Taskを使ってうまくやろうと思ったけれど断念。誰かうまく言ったという人がいればぜひ教えてください(´;ω;`)
結論
powermockとか導入するのもtoo muchな感じでつらみがあるので、
Android JVMを利用しなくても良いunit testに一旦絞ってauto testを描く方針になりそう。