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

Kotlin用Mockito验证枚举参数方法调用报非空错误如何解决

问题原因

该问题不属于Mockito的原生Bug,是Kotlin非空类型特性与Java版Mockito默认行为不兼容导致的。
你遇到的eq(SomeEnum.foo) must not be null异常,本质是Kotlin为非空参数自动插入的运行时检查触发的:Mockito原生的eq、capture等参数匹配器为了兼容Java语法,会返回null作为方法调用的占位值,而你定义的magic方法参数是不可空的枚举类型,null传入时直接触发了Kotlin的非空校验抛出异常。参数捕获无法生效的问题和该异常是同一根源。

解决方案
  • 方案1:直接省略eq匹配器
    如果你只是要验证参数等于固定枚举值,不需要组合其他匹配器,直接传入枚举常量即可,不需要套eq,完全规避匹配器的null占位问题,代码示例:
    @Test
    fun fixedTest() {
        val sut = spy(MyClass())
        sut.doSomething()
        verify(sut).magic(SomeEnum.foo)
    }
    
  • 方案2:开启Mockito inline mock maker
    不需要更换依赖,只需要在测试资源目录下创建配置文件:test/resources/mockito-extensions/org.mockito.plugins.MockMaker,写入内容mock-maker-inline,开启后Mockito会原生适配Kotlin的非空类型特性,匹配器不会再返回null占位值,原测试代码无需修改即可正常运行,同时也能解决参数捕获失效的问题。
  • 方案3:使用Mockito-Kotlin依赖
    替换原有的Mockito依赖为Kotlin适配版的Mockito-Kotlin,该库对Kotlin的非空类型、协程等特性做了专门适配,eq、capture等匹配器都会返回对应非空类型的合法占位值,不会触发空检查,原测试代码无需修改即可运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:06:03