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

Kotlin使用ArgumentMatchers的eq/any方法mock时报参数不能为空如何解决?

问题原因

Kotlin默认参数非空,编译时会对非空参数插入非空校验逻辑,而Mockito原生的eq()、any()等ArgumentMatcher默认返回null,null传入非空参数时就会触发你遇到的空指针异常。

解决方案
  • 方案1(最推荐):使用适配Kotlin的Mockito-Kotlin库,它对原有匹配器做了非空改造,不会返回null。引入依赖后把原有org.mockito.ArgumentMatchers的导入替换为org.mockito.kotlin.eq、org.mockito.kotlin.any即可,原有mock代码不需要修改。
  • 方案2:如果无法引入Mockito-Kotlin,升级Mockito到4.0及以上版本,可选择以下两种写法:
    1. 先保证eq()传入的lockId本身非空,匹配器改用泛型重载写法any<UUID>()或isNotNull()
    2. 自行包装匹配器强制返回非空值,示例如下:
      fun <T> anyNonNull(): T = org.mockito.ArgumentMatchers.any() ?: error("mock non-null value")
      
  • 检查项:你当前mock的是lockService.getTransLock方法,而业务代码实际调用的是lockDatabaseRecordService.getTransLockDbRecord,请确认mock的对象、方法名、参数列表和业务实际调用的完全一致,否则会触发未mock的真实方法调用,也会抛出空指针。
修正后代码示例(使用Mockito-Kotlin)
// 替换匹配器导入路径
import org.mockito.kotlin.eq
import org.mockito.kotlin.any
import org.mockito.kotlin.`when`

// mock逻辑无需修改
`when`(lockService.getTransLock(eq(lockId), any())).thenReturn(lock)

内容的提问来源于stack exchange,提问作者mengmeng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 00:57:03