是否可以参数化 Spock 设置
?
我的意思是,假设我有一个想要测试其状态的对象。该对象可以有多个状态,但为了简化事情,假设有一个我特别感兴趣的状态,S1
。
有多种方法可以将对象获取到S1
。我正在测试状态,因此无论对象如何到达 S1
,S1
的所有测试都将是相同的。测试用例之间唯一不同的是设置
策略。
解决这个问题的一种方法是拥有一个基本测试用例(或使用 Spock 说法的“规范”)和仅提供不同设置
策略的子类。
但是,考虑到 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
block ,因为您暗示您希望在 setup
中发生有趣的部分(这与 >given
),而 expect
是一个 then
,不需要 when
。
辅助方法的类型为void
,并执行自己的断言,如建议的in the Spock documentation (事实上,使 then
/expect
无操作,但 Spock 编译器始终强制执行它)。
数据驱动文档是here .
关于unit-testing - 参数化 Spock 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34552946/