参数化 Spock 设置

Parameterize Spock setup

是否可以参数化 Spock setup

我的意思是,假设我有一个要测试其状态的对象。对象可以有多个状态,但为了简化事情,假设有一个我特别感兴趣,S1

有多种方法可以将对象获取到 S1。我正在测试状态,因此无论对象如何到达 S1S1 的所有测试都是相同的。测试用例之间唯一不同的是 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 闭包,在数据 table 中内联定义以调用帮助程序方法来改变您新创建的对象。

在这种情况下,没有 when 块,因为您有点暗示您希望有趣的部分发生在 setup 中(与 given 相同) , expectthen, 不需要 when.

辅助方法的类型为 void,并按照建议 in the Spock documentation 进行自己的断言(实际上使 then/expect 无操作,但是 Spock 编译器总是强制执行它。

数据驱动的文档是 here