Spock单元测试中如何验证方法入参对象的部分字段值
Spock校验Mock方法入参对象部分字段的实现方案
Spock原生不支持在对象构造函数内直接传入通配符_做参数匹配,可通过以下几种无额外依赖的方式实现部分字段校验:
自定义参数匹配闭包(最通用方案)
直接使用Spock内置的参数匹配能力,传入闭包自定义校验规则,仅判断你关心的字段,其余字段不做约束:// Groovy测试代码写法 1 * someService.doSomething({ it instanceof SomeClass && it.c == "specificValue" })如果你的测试代码用Kotlin编写,需要显式调用
argThat包装匹配逻辑:// Kotlin测试代码写法 1 * someService.doSomething(argThat { it is SomeClass && it.c == "specificValue" })这个写法的匹配逻辑完全可控:只要传入参数是
SomeClass类型,且c字段值等于specificValue就判定为匹配,a、b字段的任意取值都不会影响校验结果。提取通用匹配方法(适合多用例复用场景)
如果同一个类的部分字段校验在多个测试场景下重复使用,可以把匹配逻辑抽成测试类内的公共方法,减少冗余代码:// 测试类内定义公共匹配方法 SomeClass withCValue(String expectedC) { argThat { it instanceof SomeClass && it.c == expectedC } } // 交互校验时直接调用 1 * someService.doSomething(withCValue("specificValue"))Kotlin data class 解构匹配(适配Kotlin场景)
针对Kotlin的data class,可以利用其解构声明特性,让字段匹配的逻辑更直观,和你最初想实现的构造函数通配符逻辑完全一致:1 * someService.doSomething(argThat { val (_, _, c) = it as SomeClass c == "specificValue" })解构时用
_占位不关心的a、b字段,仅校验c字段的取值。
注意:自定义匹配闭包内不要写无关逻辑,仅保留必要的字段校验规则即可,避免测试本身的逻辑复杂度上升引入误判。
内容的提问来源于stack exchange,提问作者paulonio
相关产品推荐
相关产品推荐

