KotlinでMockitoを使うとanyがうまくいかない

Posted at 2018-05-29

テストでMockitoを使っていると、 any(Class<T>) を使いたくなる場面は、そこそこ多いように思います。ところが、Kotlinでテストを書いていると、これを受け取ったKotlin実装のメソッドで以下のようなエラーが吐かれてしまい、テストが書けません。

java.lang.IllegalStateException: Mockito.any(Hoge::class.java) must not be null

調べてみると、近い内容でお困りのケースが見つかったので、これを参考に対応してみました。

要件

  • Kotlin 1.2.21
  • Mockito 1.10.19

対処法

一度Kotlin実装された別のメソッドでラップしてあげて、Kotlinで実装されたメソッドに、Null安全な状態で渡してあげれば良いようでした。以下のようにします。

@Test
fun test() {
    val invokerMock = Mockito.mock(Invoker::class.java)
    // 中略
    Mockito.verify(invokerMock, Times(1)).invoke(any(Param::class.java))
}

private fun <T> any(clazz: Class<T>): T {
    return Mockito.any(clazz)
}
1
2
3
4
5
6
7
8
9
10