Mockito Kotlin使用any()仍无法匹配存根,返回null求助
核心问题:参数顺序不匹配
你当前的存根代码犯了一个关键错误:存根时的参数顺序和方法定义的参数顺序完全不一致。Mockito的匹配逻辑严格遵循方法签名的参数顺序,不管调用时是否使用命名参数,只要顺序错位,就会导致存根无法匹配实际调用。
看你的方法签名,getCodingTool的参数顺序是:
fun getCodingTool( ecu: String, variant: String, parametrizationId: UUID, codingToolInternalId: UUID, versionId: UUID? = null, versionNumber: Int? = null, minorVersionNumber: Int? = null, includeVcds: Boolean = true, includeFragments: Boolean = true, )
但存根代码里的参数顺序是ecu → versionId → versionNumber → minorVersionNumber → variant → codingToolInternalId → ...,和方法定义的顺序完全错位,这是存根失效的主要原因。
具体解决步骤
严格对齐参数顺序
存根时必须完全遵循方法签名的参数顺序,哪怕使用命名参数也要对应顺序,或者直接按顺序传匹配器(更不容易出错)。示例:whenever( creatorDataApi.getCodingTool( ecu = anyString(), variant = anyString(), parametrizationId = any(), codingToolInternalId = any(), versionId = anyOrNull(), versionNumber = anyOrNull(), minorVersionNumber = anyOrNull(), includeVcds = anyBoolean(), includeFragments = anyBoolean() ) ).thenReturn(...)或者省略命名参数,直接按顺序传:
whenever( creatorDataApi.getCodingTool( anyString(), anyString(), any(), any(), anyOrNull(), anyOrNull(), anyOrNull(), anyBoolean(), anyBoolean() ) ).thenReturn(...)替换自定义Helper,使用Mockito-Kotlin库
原生Mockito在Kotlin中处理非空、可空类型的匹配器很繁琐,你自己写的MockitoHelper存在潜在的类型不安全问题。建议直接使用Mockito-Kotlin库,它提供了更贴合Kotlin语法的匹配器:- 添加Gradle依赖:
testImplementation "org.mockito.kotlin:mockito-kotlin:4.1.0" - 直接使用
any()(自动适配非空类型)、anyOrNull()(适配可空类型)、anyString()等,无需自定义Helper。
- 添加Gradle依赖:
用verify验证调用参数
如果存根还是不匹配,可以用verify()检查实际调用的参数是否符合预期,比如:verify(creatorDataApi).getCodingTool( anyString(), anyString(), any(), any(), anyOrNull(), anyOrNull(), anyOrNull(), eq(true), // 匹配默认值true eq(true) )如果verify失败,控制台会输出实际调用的参数值,帮你快速定位不匹配的点。
确认默认参数的匹配
方法中includeVcds和includeFragments默认值为true,如果实际调用时没有显式传这两个参数,存根时要么用eq(true)精确匹配,要么用anyBoolean()兼容任意布尔值,确保匹配逻辑和实际调用一致。
内容的提问来源于stack exchange,提问作者FeXseven

