where-clause - 如何在 spock 测试的 where 子句中调用方法或闭包

标签 where-clause spock

我正在使用 Spock 测试 atm,我想知道这样的事情是否可行。我的方法不起作用,我想知道你们中是否有人有类似的意图并找到了方法。

我想调用一个方法或一个闭包,必须只为每个各自的 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 子句中的闭包周围添加更多括号。

例如。 ({ println("1") })

或者作为完整的规范。

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'})
}

关于where-clause - 如何在 spock 测试的 where 子句中调用方法或闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21113794/

相关文章:

ruby-on-rails - 查找多态关联或 nil 的记录

hibernate - Grails 2.4.3集成测试错误java.lang.NoClassDefFoundError:org/springframework/mock/web/MockAsyncContext

mysql - 如何比较多个表列的多个值?

mysql - VIEW 与 WHERE 的功能

groovy - 在 spock 中对列表进行断言

java - Spock 使用 Mockito 测试 Kotlin 类

java - Spock通过Maven启动后测试不成功

java - 在 spock 单元测试规范中传递实际参数

php - 我可以在 select 语句中使用两个Where吗

mysql - SQL Left/Inner/Normal Join vs Where while 条件语句