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

