You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中使用Mockito.argThat匹配器报非空异常问题求助

解决Kotlin中Mockito argThat引发的IllegalStateException问题

嘿,这个坑我之前也踩过!本质上是Kotlin的空安全机制和原生Mockito Java API的适配冲突——Java里argThat允许返回null,但如果你的sendPoke方法要求非空参数,直接用原生Mockito的argThat就会触发空检查错误,因为Kotlin判定这个匹配器可能返回null,而方法不接受null值。

最推荐的解决方案:使用Mockito-Kotlin适配库

Mockito专门针对Kotlin特性做了适配库,用它的argThat能从根源上解决空安全问题,步骤很简单:

  1. 先引入Mockito-Kotlin依赖(如果项目里还没加的话)
  2. 替换原生Mockito的调用写法:
import com.nhaarman.mockitokotlin2.argThat
import com.nhaarman.mockitokotlin2.whenever

whenever(dataSource.sendPoke(argThat { argument -> true }))
    .thenReturn(Observable.just(CommonResponse()))

这个版本的argThat会自动适配Kotlin的空安全规则,不会返回null,完美匹配非空参数的方法,写起来也比原生API简洁。

临时救急方案:给原生argThat加非空断言

如果暂时不想引入新库,可以在原生argThat后面加上!!非空断言,明确告诉Kotlin这个值不会为null:

Mockito.`when`(
    dataSource.sendPoke(Mockito.argThat({ argument -> true })!!)
).thenReturn(Observable.just(CommonResponse()))

不过这个方式有风险,如果匹配器逻辑意外返回null(虽然概率极低),会直接触发NullPointerException,所以只适合临时救急。

针对可空参数的方案:用nullableArgThat(Mockito 3.+)

如果你的sendPoke方法参数本身是可空类型,且Mockito版本在3.0以上,可以用nullableArgThat匹配器:

Mockito.`when`(
    dataSource.sendPoke(Mockito.nullableArgThat { argument -> true })
).thenReturn(Observable.just(CommonResponse()))

但如果参数是非空类型,这个方法还是会触发空安全错误,所以优先级不如第一种方案。

总的来说,Mockito-Kotlin是一劳永逸的解决办法,毕竟它就是为了抹平Kotlin和原生Mockito之间的适配差异而生的。

内容的提问来源于stack exchange,提问作者Patryk Jabłoński

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:15:36