LoginSignup
1
0

KotlinでMockitoを使用したとき、Mockito.any() must not be nullエラーが発生する

Last updated at Posted at 2023-07-05

Kotlinの実装のユニテでMockitoを使用したときに、表題のエラーでハマってしまったので、解決法を記事化しました。

エラーの内容

java.lang.IllegalStateException: Mockito.any() must not be null
  • Mockito はany()のようなメソッドの呼び出しに対してnullを返しますが、Kotlinではデフォルトでnullが許容されないため上記のようなエラーが発生してしまいます。
  • 上記の問題は、mockito-kotlinを導入することで解決できます。

mockito-kotlinの導入

  • build.gradle.ktsに依存関係を追加
testImplementation("org.mockito.kotlin:mockito-kotlin:5.0.0")

mockito-kotlinの使用方法

  • モックの作成方法
val mock : MyClass = mock()
  • スタブの作成方法
mock.stub { on { stringValue() } doReturn "test" }
// or
given(mock.method(any())).willReturn("hoge")
  • メソッド呼び出しの検証
verify(myClass, times(2)).doSomething(any())
  • Argument Matchers
verify(myClass).setItems(argThat { size == 2 } )
  • Argument Captors
val messageCaptor: ArgumentCaptor<String> = ArgumentCaptor.forClass(String::class.java)
argumentCaptor<String>().apply {
  verify(myClass, times(2)).setItems(capture(messageCaptor))
  assertEquals("test", messageCaptor.value)
}

(余談) KotlinでMockitoを用いる際の、final classに関する注意点(バージョン4.x.x以前の場合)

  • Kotlinではデフォルトで全てのクラスがfinal classとなリますが、バージョン4.x.x以前のMockitoはデフォルトでfinal classをモックできないため、下記のようなエラーが発生してしまいます。
Mockito cannot mock/spy because :
 - final class
  • 上記の問題点については、以下のいずれかを実施すれば解決できます
    1. mockito-coreまたはmockito-kotlinのバージョンを5.0.0以上に上げる
      • 5.0.0以上のバージョンでは、デフォルトでfinal class/method のモックをサポートするようになったため。
    2. mockito-coreの代わりに、final class/methodのモックをサポートするmockito-inlineを依存関係に含める。mockito-kotlinを使用している場合は、mockito-inlineを依存関係に含める
    3. src/test/resources/mockito-extensions/org.mockito.plugins.MockMakerファイルを作成し、mock-maker-inlineと記載し、final class/method用のモックメーカーを明示的にアクティブ化する。

まとめ

  • Kotlinでは、Javaと同じようにはMockitoを使えない箇所がありますが、基本的にmockito-kotlinのバージョン5以降を使うことで解決できそうです

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0