Mock the un-mockable Kotlin classes
tl;dr
- Kotlinクラスはデフォルトfinalだからモックできない
- Mockito2ならできるよ
Kotlinのクラス、関数はデフォルトでfinalだからモックできない。
Kotlinのクラス、関数はデフォルトfinalで継承もオーバーライドもできないのでMockitoでモックすることができません。
なので今までは以下のどれかでモック可能な状態にしていました。
- openで継承可能、オーバーライド可能にする
- All-open pluginでクラス/関数をすべてopenにする
- Interfaceに切り出しておく
- PoweMockを利用する
Mockito2.1.0でfinalでもモックできるようになった
Mockito2.1.0でMockMakerというものが導入されました。ただしMockMakerはまだ実験的段階で、デフォルトではオフになっています。
MockMakerを利用する方法は2つ用意されています。
MockMaker fileを用意する。
src/test/resources/mockito-extensions
ディレクトリに以下の一行を含むorg.mockito.plugins.MockMaker
ファイルを置きます。
mock-maker-inline
たった一行のファイルを置くだけなのでそんなに手間ではないかな?
mockito-inlineを利用する
こちらはgradleでdependenciesを書き換えるだけです。
dependencies { // testCompile "org.mockito:mockito-core:2.x.y" testCompile "org.mockito:mockito-inline:2.x.y" }
どちらを利用するか
私は基本的にMockitoは直接扱っておらず、mockito-core
に依存しているKotlin向けのExtensionライブラリを利用しているのでMockMaker fileを置く方法を利用してます。