没有设置运行特定的Spock测试?

时间:2018-02-02 10:13:55

标签: testing spock

documentation Spock中,在“夹具方法”一节中提到了这些功能:

def setup() {}          // run before every feature method
def cleanup() {}        // run after every feature method
def setupSpec() {}     // run before the first feature method
def cleanupSpec() {}   // run after the last feature method

我正在使用setup函数为所有测试初始化​​新对象。然而,一些测试应该测试当没有其他对象时会发生什么。

由于设置,这些测试现在失败了。

有没有办法暂停某些功能的设置?注释也许?

或者我是否必须创建一个单独的“设置”功能,并在每次测试中调用它们。大多数测试使用它!

1 个答案:

答案 0 :(得分:2)

您始终只能为该特定方法覆盖测试方法中的值。看一下下面的例子:

import spock.lang.Shared
import spock.lang.Specification

class SpockDemoSpec extends Specification {

    String a
    String b

    @Shared
    String c

    def setup() {
        println "This method is executed before each specification"
        a = "A value"
        b = "B value"
    }

    def setupSpec() {
        println "This method is executed only one time before all other specifications"
        c = "C value"
    }

    def "A empty"() {
        setup:
        a = ""

        when:
        def result = doSomething(a)

        then:
        result == ""
    }

    def "A"() {
        when:
        def result = doSomething(a)

        then:
        result == "A VALUE"

    }

    def "A NullPointerException"() {
        setup:
        a = null

        when:
        def result = doSomething(a)

        then:
        thrown NullPointerException
    }

    def "C"() {
        when:
        def result = doSomething(c)

        then:
        result == 'C VALUE'
    }

    private String doSomething(String str) {
        return str.toUpperCase()
    }
}

在此示例中,ab在每次测试之前设置,c仅在执行任何规范之前设置一次(这就是为什么需要@Shared This method is executed only one time before all other specifications This method is executed before each specification This method is executed before each specification This method is executed before each specification This method is executed before each specification 1}}注释,以便在执行之间保持它的价值。

当我们运行此测试时,我们将在控制台中看到以下输出:

c

一般的经验法则是,在setupSpec方法设置后,您不应该更改@Stepwise值 - 主要是因为您不知道哪些订单测试是将被执行(如果您需要保证订单,您可以使用a注释对您的类进行注释 - Spock将运行所有情况,以便在这种情况下定义它们)。如果是b和{{1}},您可以在单个方法级别覆盖它们 - 它们将在执行另一个测试用例之前重新初始化。希望它有所帮助。