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
相关产品推荐
相关产品推荐

