【发布时间】:2014-01-14 12:39:59
【问题描述】:
我正在使用 Spock 测试自动取款机,我想知道这样的事情是否可行。我的方法不起作用,我想知道你们中是否有人有类似的意图并找到了方法。
我想调用一个方法或一个闭包,它只能为每个相应的 where 子句调用才能设置一些东西。我不能只调用所有这些方法,因为它会破坏我的测试。到目前为止我发现的唯一方法是检查当前状态是什么,并在 if 语句中相应地调用该方法,例如: if(state==SomeStateEnum.FIRST_STATE){somePrivateMethodFromSpec()} 但我想知道它是否无法完成以更好的方式。我希望我的意图很明确(对不起,我不是母语人士)下面是一些示例代码,可能会更好地理解我想要做什么。提前谢谢你。
def 'is this even possible?'() {
when:
def resultState = service.someServiceMethod(param)
then:
resultState == state
where:
state | param | method
SomeStateEnum.FIRST_STATE | 'param1' | somePrivateMethodFromSpec()
SomeStateEnum.SECOND_STATE | 'param2' | someOtherPrivateMethodFromSpec()
}
private def somePrivateMethodFromSpec() {
someServiceMock.demand.AAA() {}
}
private def someOtherPrivateMethodFromSpec() {
someServiceMock.demand.BBB() {}
}
def 'or maybe something like this?'() {
when:
closure.call()
def resultState = service.someServiceMethod(param)
then:
resultState == state
where:
state | param | closure
SomeStateEnum.FIRST_STATE | 'param1' | {println '1'}
SomeStateEnum.SECOND_STATE | 'param2' | {println '2'}
}
解决办法是:
def 'this will work'() {
"$someOtherPrivateMethodFromSpec"()
"$somePrivateMethodFromSpec"()
def resultState = service.someServiceMethod(param)
then:
resultState == state
where:
state | param | method
SomeStateEnum.FIRST_STATE | 'param1' | "somePrivateMethodFromSpec"
SomeStateEnum.SECOND_STATE | 'param2' | "someOtherPrivateMethodFromSpec"
}
private def somePrivateMethodFromSpec() {
someServiceMock.demand.AAA() {}
}
private def someOtherPrivateMethodFromSpec() {
someServiceMock.demand.BBB() {}
}
【问题讨论】:
标签: where-clause spock