Mock the un-mockable Kotlin classes

f:id:lvla:20170430014523p:plain

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を置く方法を利用してます。