Проверка поведения с использованием параметризованного фреймворка Spock

#groovy #spock

#groovy #spock

Вопрос:

У меня есть набор поведенческих тестов, которые должны привести к тому же результату

 def 'behaviour tests for route A'() {
 when:
   doA();

 then:
  data == 'Hi'
}

def 'behaviour tests for route B'() {
 when:
   doB();

 then:
  data == 'Hi'
}

void doA(){
 ...
}

void doB(){
 ...
}
  

код выглядит некрасиво, я бы предпочел использовать параметризованное тестирование. что-то рядом с этим:

 @Unroll
def 'behaviour tests for route #name'() {
     when:
       route
    
     then:
      data == 'Hi'

     where:
      name | route
      'A'  | doA()
      'B'  | doB()
}
  

Есть ли способ это сделать?

Ответ №1:

Вы можете использовать замыкания для извлечения кода, который вы хотите выполнить в when блоке.

 class ClosureSpec extends Specification {

  @Unroll
  def 'behaviour tests for route #name'() {
    when:
    def data = route()

    then:
    data == 'Hi'

    where:
    name | route
    'A'  | { doA() }
    'B'  | { doB() }
  }

  def doA() {
    return 'Hi'
  }

  def doB() {
    return 'Hi'
  }
}
  

или вы могли бы использовать динамическую природу groovys для передачи имени метода

 class DynamicSpec extends Specification {

  @Unroll
  def 'behaviour tests for route #name'() {
    when:
    def data = this."do$name"()

    then:
    data == 'Hi'

    where:
    name | route
    'A'  | _
    'B'  | _
  }

  def doA() {
    return 'Hi'
  }

  def doB() {
    return 'Hi'
  }
}
  

В зависимости от варианта использования я бы выбрал закрытие, но имя динамического метода имеет свое применение, особенно если вы хотите передать параметры.