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能从根源上解决空安全问题,步骤很简单:
- 先引入Mockito-Kotlin依赖(如果项目里还没加的话)
- 替换原生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
相关产品推荐
相关产品推荐

