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

