是否可以参数化Spock setup
?
我的意思是,想象一下我有一个对象的状态我要测试。该对象可以有多个状态,但为了简化事情,让我们说有一个我特别感兴趣的,S1
。
有多种方法可以将对象传递给S1
。我正在测试状态,因此无论对象如何到达S1
,S1
的所有测试都将是相同的。测试用例之间不同的一点是setup
策略。
解决这个问题的一种方法是使用基本测试用例(或“spec”来使用Spock用语)和仅提供不同setup
策略的子类。
但是,鉴于Spock提供的测试具有良好的数据驱动功能,我想知道是否可能有某种方式来参数化设置,以便我不需要具体的子类规范。
实际上,我会说,这是一个规范,现在使用这些不同的执行设置方式运行它。
总是很高兴至少有一些代码作为示例,但在这里你去。 试图将您的文字放入数据驱动的规范中:
class MyObjectSpec extends Specification {
@Unroll
def "Using setup strategy '#desc', instance of MyObject will reach state S1" {
setup:
def myObject = new MyObject()
setupStrategy.call(myObject)
expect:
hasStateS1(myObject)
where:
setupStrategy | desc
{ setupThisWay(it) } | 'this way'
{ setupThatWay(it) } | 'that way'
{ setupAnotherWay(it) } | 'another way'
}
void setupThisWay(MyObject myObject) {
// mutate myObject
}
// setupThatWay, setupAnotherWay
void hasStateS1(MyObject myObject) {
assert myObject.hasStateS1()
}
}
我们使用Groovy闭包,在数据表中内联定义来调用改变新创建对象的辅助方法。
在这种情况下,没有when
块,因为你有点暗示你想要在setup
(与given
相同)中发生有趣的部分,而expect
是then
,不需要when
。
辅助方法是void
类型,并做自己的断言,如in the Spock documentation建议的那样(实际上制作then
/ expect
no-op,但是Spock编译器强制执行它)。
数据驱动的文档是here。