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

如何在MockK中捕获可变参数(vararg)方法的传入参数?

MockK可变参数方法的参数捕获解决方案

我们可以对MockK中的可变参数方法进行mock,示例代码如下:

interface ClsWithManyMany {
    fun manyMany(vararg x: Any): Int
}

val obj = mockk<ClsWithManyMany>()
every { obj.manyMany(*anyVararg()) } returns 2
println(obj.manyMany("testing", "testing")) // 输出2

如果需要捕获传入该方法的参数,以下写法无法正常生效,使用mutableListOf<Array<Any>>()进行捕获的写法同样不可行:

// 错误示例,无法完成参数捕获
val captured = slot<Array<Any>>()
every { obj.manyMany(*capture(captured)) } answers {
    println ("arguments: ${captured.captured}")
    2
}

失效原因

上述写法不生效的核心原因是,*为Kotlin的可变参数展开操作符,使用*capture(captured)时,捕获逻辑会被解析为捕获单个参数元素,和可变参数整体是数组的属性不匹配,导致捕获失败。

可行解决方案

方案1:使用captureVararg专门捕获可变参数

MockK官方提供了captureVararg方法适配可变参数的捕获场景,会自动将所有传入的可变参数元素收集到指定的可变列表中:

val captured = mutableListOf<Any>()
every { obj.manyMany(*captureVararg(captured)) } answers {
    println("传入的参数列表:$captured")
    2
}

调用方法后,所有传入manyMany的可变参数都会按顺序存入captured列表。

方案2:在answers块内直接读取参数数组

可变参数在方法执行上下文中等价于数组类型,你可以直接在answers作用域内通过下标读取整个参数数组,无需提前定义捕获槽:

every { obj.manyMany(*anyVararg()) } answers {
    // 读取第一个参数,类型为传入的可变参数对应的数组
    val argsArray = firstArg<Array<Any>>()
    println("传入的参数数组:${argsArray.contentToString()}")
    2
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:24:02