#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'
}
}
В зависимости от варианта использования я бы выбрал закрытие, но имя динамического метода имеет свое применение, особенно если вы хотите передать параметры.