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

Mockito Kotlin使用any()仍无法匹配存根,返回null求助

Mockito存根Kotlin方法不匹配的排查与解决思路

核心问题:参数顺序不匹配

你当前的存根代码犯了一个关键错误:存根时的参数顺序和方法定义的参数顺序完全不一致。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 → ...,和方法定义的顺序完全错位,这是存根失效的主要原因。

具体解决步骤

  1. 严格对齐参数顺序
    存根时必须完全遵循方法签名的参数顺序,哪怕使用命名参数也要对应顺序,或者直接按顺序传匹配器(更不容易出错)。示例:

    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(...)
    
  2. 替换自定义Helper,使用Mockito-Kotlin库
    原生Mockito在Kotlin中处理非空、可空类型的匹配器很繁琐,你自己写的MockitoHelper存在潜在的类型不安全问题。建议直接使用Mockito-Kotlin库,它提供了更贴合Kotlin语法的匹配器:

    • 添加Gradle依赖:
      testImplementation "org.mockito.kotlin:mockito-kotlin:4.1.0"
      
    • 直接使用any()(自动适配非空类型)、anyOrNull()(适配可空类型)、anyString()等,无需自定义Helper。
  3. 用verify验证调用参数
    如果存根还是不匹配,可以用verify()检查实际调用的参数是否符合预期,比如:

    verify(creatorDataApi).getCodingTool(
        anyString(),
        anyString(),
        any(),
        any(),
        anyOrNull(),
        anyOrNull(),
        anyOrNull(),
        eq(true), // 匹配默认值true
        eq(true)
    )
    

    如果verify失败,控制台会输出实际调用的参数值,帮你快速定位不匹配的点。

  4. 确认默认参数的匹配
    方法中includeVcds和includeFragments默认值为true,如果实际调用时没有显式传这两个参数,存根时要么用eq(true)精确匹配,要么用anyBoolean()兼容任意布尔值,确保匹配逻辑和实际调用一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:23:12