【问题标题】:Parameterize Spock setup参数化 Spock 设置
【发布时间】:2016-01-01 01:36:41
【问题描述】:

是否可以参数化 Spock setup

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

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

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

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

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

【问题讨论】:

  • 你能举个例子吗?您正在寻找的不是数据驱动测试吗?

标签: unit-testing testing spock


【解决方案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 相同),而expect 是@ 987654328@,不需要when

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

数据驱动的文档是here

【讨论】:

    猜你喜欢
    • 2018-03-09
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多