参数化Spock设置

时间:2016-01-01 01:36:42

标签: unit-testing testing spock

是否可以参数化Spock setup

我的意思是,想象一下我有一个对象的状态我要测试。该对象可以有多个状态,但为了简化,我们可以说有一个我特别感兴趣的是S1

有多种方法可以将对象转移到S1。我正在测试状态,因此无论对象如何到达S1S1的所有测试都将是相同的。测试用例之间的一个不同之处是setup策略。

解决这个问题的一种方法是使用基本测试用例(或“spec”来使用Spock用语)和仅提供不同setup策略的子类。

但是,鉴于Spock提供的测试具有良好的数据驱动功能,我想知道是否可能有某种方式来参数化设置,以便我不需要具体的子类规范。

实际上,我会说,这是一个规范,现在用这些不同的方式执行设置运行它。

1 个答案:

答案 0 :(得分:1)

总是很高兴至少有一些代码作为示例,但是您就可以了。
尝试把您的话写成数据驱动的规范:

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相同),并且expectthen,不需要when

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

数据驱动的文档为here