2014-01-14 2 views
4

Я работаю с аттестатами Spock atm, и мне интересно, возможно ли что-то подобное. Мои подходы не работают, и я задаюсь вопросом, были ли у кого-то из вас сходные намерения и нашли способ.как вызвать метод или замыкание в предложении where в тесте spock

Я хочу вызвать метод или закрытие, которое должно вызываться только для каждого соответствующего where-clause, чтобы настроить некоторые вещи. Я не могу просто вызвать все эти методы, так как это испортит мой тест. Единственный способ, который я нашел до сих пор, - проверить, что такое текущее состояние, и вызвать метод соответствующим образом в выражении 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'}) 
} 
Смежные вопросы