Mockitoでfinal classをモックする

mockitoとは

mockitoはJavaユニットテストでクラスをモック可能にするためのフレームワークです。

site.mockito.org

gradleを使っている場合は以下のように mockito-core を依存に追加することで使用できます。

dependencies { testCompile "org.mockito:mockito-core:2.+" }

final classをモックする

mockitoは、デフォルトの状態では final なクラスやメソッドをモックすることができなくなっています。
しかし、設定を追加することで final なクラスやメソッドがモック可能になります。今回はその方法を2つ紹介します。

設定ファイルを追加する方法

1つ目はmockitoのドキュメントに書いてある方法で、以下の値を書いた /mockito-extensions/org.mockito.plugins.MockMaker ファイルを追加するというものです。 Mockito - mockito-core 3.4.6 javadoc

mock-maker-inline

テストコードが test ディレクトリに配置されている場合は test/resources/mockito-extensions/org.mockito.plugins.MockMaker に追加すると良いでしょう。

mockito-inline ライブラリを追加する方法

2つ目は mockito-inline ライブラリを追加する方法です。

dependencies{ testCompile "org.mockito:mockito-inline:2.+" }

このライブラリで行っていることは1つ目の方法とほぼ同じで、クラスパスに /mockito-extensions/org.mockito.plugins.MockMaker を追加します。

ライブラリのソースは https://github.com/mockito/mockito/tree/release/2.x/subprojects/inline に上がっており、テストコードやgradleファイルを除けば main/resources/mockito-extensions/org.mockito.plugins.MockMaker のファイルが1つあるだけとなっています。

最後に

final なクラスやメソッドをモックする必要がある場合には、設定ファイルを追加する必要があります。今回、2つの方法を紹介しましたがどちらも同じことを行っているためお好きな方法を選ぶと良いでしょう。

注意点として、ドキュメントにあるように一部のメソッドは上記の方法ではモックすることができません。

Some methods cannot be mocked
Package-visible methods of java.*
native methods