【问题标题】:how to call a method or closure in a where clause in a spock test如何在 spock 测试的 where 子句中调用方法或闭包
【发布时间】: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


    【解决方案1】:

    为了调用闭包方式,您只需要在 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'})
    }
    

    【讨论】:

      【解决方案2】:

      不确定这是否正是您需要的,但您可以尝试一下:

      class MyFirstSpec extends Specification {
        def "let's try this!"() {
          expect:
            "${method}"() == method
          where:
            method << ["method1", "method2"]
        }
      
        private String method1(){
           return "method1"
        }
      
        private String method2(){
           return "method2"
        }
      }
      

      【讨论】:

      • 是的,这正是我所需要的。谢谢。:) 我根据我的问题用解决方案编辑我的帖子。
      猜你喜欢
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多