2014-01-14 30 views
4

我正在使用Spock測試atm,並且我想知道這樣的事情是否甚至是可能的。我的方法行不通,我想知道你們中的任何人是否有類似的意圖,並找到了一種方法。如何在spock測試中的where子句中調用某個方法或關閉

我想調用一個方法或閉包,只能針對每個相應的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() {} 
} 

回答

5

不知道這是你需要什麼,但你可以嘗試一下:

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" 
    } 
} 

+0

是的,這就是我所需要的。謝謝。:)我根據我的問題修改了我的帖子。 – IwantToKnow

2

爲了調用閉包的方式,你只需要在where子句的閉包中添加更多的括號。

E.g. ({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'}) 
} 
相關問題