Groovy Spock:如何验证含两个参数的方法交互?
Spock Mock多方法参数的捕获与验证方法
在Spock中验证Mock方法的多参数调用,有几种直观的实现方式,以下结合你的代码示例逐一说明:
1. 直接指定参数值验证调用次数与参数匹配
这是最简洁的方式,直接在then块中声明方法调用次数,同时指定每个参数的预期值:
def "should do something"(){ given: MyAction action = Mock() when: action.doSomething(123, "abc") then: // 验证方法被调用1次,且两个参数分别为123和"abc" 1 * action.doSomething(123, "abc") }
这里的1 *表示方法被调用的次数,后面紧跟方法名和预期的参数值,完全匹配时验证通过。
2. 使用闭包实现灵活参数校验
如果需要对参数做更复杂的逻辑验证(比如范围判断、字符串匹配等),可以在参数位置使用闭包:
def "should do something with complex param check"(){ given: MyAction action = Mock() when: action.doSomething(123, "abc") then: // 第一个参数等于123,第二个参数长度为3 1 * action.doSomething({ it == 123 }, { it.length() == 3 }) }
闭包中的it代表对应位置的参数,你可以在闭包内编写任意校验逻辑,只要返回true即表示参数匹配。
3. 捕获参数到变量后验证
如果需要在验证后复用参数值,或者分步验证参数,可以通过闭包捕获参数到外部变量:
def "should capture and verify params"(){ given: MyAction action = Mock() def capturedFirstParam def capturedSecondParam when: action.doSomething(123, "abc") then: // 捕获参数到变量,_表示匹配任意参数 1 * action.doSomething(_, _) >> { int first, String second -> capturedFirstParam = first capturedSecondParam = second return "mockReturnValue" // 可选:指定Mock方法的返回值 } // 验证捕获到的参数 capturedFirstParam == 123 capturedSecondParam == "abc" }
这种方式先捕获参数,再单独验证,适合需要对参数做多步校验的场景。
4. 结合Hamcrest匹配器验证
如果习惯使用Hamcrest匹配器,可以导入匹配器后在参数位置使用:
import spock.lang.Specification import static spock.util.matcher.HamcrestMatchers.* def "should verify params with Hamcrest matchers"(){ given: MyAction action = Mock() when: action.doSomething(123, "abc") then: // 使用eq匹配器验证参数,支持更复杂的Hamcrest匹配逻辑 1 * action.doSomething(eq(123), containsString("ab")) }
这种方式适合复用已有的Hamcrest匹配规则,比如字符串包含、数值范围等。
内容的提问来源于stack exchange,提问作者diziaq
相关产品推荐
相关产品推荐

