Spock:如何在规范的实现之间正确共享功能

时间:2021-01-13 20:18:00

标签: testing groovy spock

我遇到了 Spock 框架 (1.3-groovy-2.5) 的一个不幸方面,我将其用于 Gradle 插件的集成测试。

代码示例

父类:

class ClassA extends Specification {

    def setupSpec() {
        System.out.println("In ClassA setupSpec()")
    }

    def "base feature"() {
        expect:
        true
    }
}

子类:

class ClassB extends ClassA {

    @Override
    def setupSpec() {
        System.out.println("In ClassB setupSpec()")
    }

    def "extended feature"() {
        expect:
        true
    }
}

当我在 ClassB 中运行测试时,setupSpec() 的两个版本都被调用:

In ClassA setupSpec()
In ClassB setupSpec()

当然,如果我通过原生 Groovy 方式调用方法:

class Main {

    static void main(String[] args) {
        ClassB classB = new ClassB()
        classB.setupSpec()
    }
}

然后我只看到预期的内容:

In ClassB setupSpec()

所以,很明显,这是某种 Spock 功能。

问题

实际上,在覆盖设置逻辑的同时从 Specification 的实现继承的建议方法是什么?

1 个答案:

答案 0 :(得分:1)

作为 documented,fixture 方法并不意味着相互覆盖,而是相互补充,即它们都以特定的逻辑顺序被调用。就像你说的,这是一个功能。

因此,我的回答是:没有建议的方法来覆盖设置逻辑。相反,建议的方法是以不需要覆盖的方式设计您的基础和派生规范。我从来没有遇到任何问题,希望你也能轻松解决你的问题。

您的示例代码过于简明,无法多说,但基本上将基类中的夹具方法视为负责设置和清理其中的夹具字段,而派生规范的夹具方法将处理特定于其他夹具的到那些班级。在您的示例中,基础规范中还有一个功能方法,我觉得这很奇怪,因为它会针对基础规范本身执行,并且每次执行派生规范时都会执行。我更喜欢将基本规范视为实际上是抽象的(避免向它们添加任何特征方法以及它们被测试运行器选取),但我确信在某些情况下,您上面所勾画的内容也可能会有所帮助。我现在想不出一个。

相关问题