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

MockK如何验证函数被调用时传入密封类的指定子类类型参数

问题原因

JVM 存在泛型擦除机制,你之前使用的 any<T>() 匹配器的泛型参数仅在编译期做类型约束,运行时不会校验实际的子类类型,只会校验参数是否为密封类 A 的非空实例,所以不管你填入 any<B>()、any<C>() 还是 any<D>(),都会匹配所有子类实例,导致校验全部通过。

解决方案

使用 MockK 提供的 ofType<T>() 参数匹配器即可,该匹配器会在运行时通过类型判断检查参数的实际类型,不受泛型擦除影响。

基础校验写法(验证调用时传入了 B 类型实例)

verify { instance.doSomething(ofType<B>()) }

严格校验写法(验证函数仅被 B 类型参数调用,无其他子类调用)

// 验证存在1次传入B类型的调用,次数可按需调整
verify(exactly = 1) { instance.doSomething(ofType<B>()) }
// 验证不存在传入C、D类型的调用
verify(exactly = 0) { instance.doSomething(ofType<C>()) }
verify(exactly = 0) { instance.doSomething(ofType<D>()) }

自定义校验写法(同时匹配类型和参数属性)

如果需要同时校验参数的属性值,可以搭配 match 匹配器使用:

verify { 
  instance.doSomething(match { it is B && it.targetField == expectedValue }) 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 10:57:02