参数化Spock设置

问题描述 投票:1回答:1

是否可以参数化Spock setup

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

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

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

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

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

unit-testing testing spock
1个回答
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 no-op,但是Spock编译器强制执行它)。

数据驱动的文档是here

© www.soinside.com 2019 - 2024. All rights reserved.