Java spock框架中的高级助手方法

Java spock框架中的高级助手方法,java,groovy,spock,Java,Groovy,Spock,我使用Spock框架。我知道helper方法可以封装then:块中的逻辑。我需要的是在同一个类中的不同特性方法之间重用几行代码。当:一个然后:块时,这些代码行包含,例如: def "myFeatureMethod"() { given: ... when: ... then: ... myHelperMethod } private void myHelperMethod() { when: ... the

我使用Spock框架。我知道helper方法可以封装
then:
块中的逻辑。我需要的是在同一个类中的不同特性方法之间重用几行代码。当:一个
然后:
块时,这些代码行包含
,例如:

def "myFeatureMethod"() {
    given:
    ...

    when:
    ...

    then:
    ...

    myHelperMethod
}

private void myHelperMethod() {
    when:
    ...

    then:
    ...
}

据我所知,斯波克目前不可能做到这一点。是否有任何解决方法可以实现相同的目标?

首先,让我们确保理解Spock框架中每个块的含义

当:时使用是为了我们希望检查的条件

使用then:是为了得到我们希望得到的结果

对于相同的,当:块具有相同的条件时,然后:块应具有相同的结果

最佳做法是省略then:块中的一个(在第一次检查之后,您可能会发现其中一个是不相关的)。 省略不相关的后:块,当:
块保留时,可以合并2个

另一种选择是在每次Spock测试结束时使用清洁方法

这可以通过两种方式实现:

  • 使用常用方法,例如:
  • 在相关测试中使用清理:块。当: myHelperMethod()中的块,而应忽略then:块,因为检查对检查不太重要

  • 如果您试图重用,那么:块意味着您需要多个单元测试来检查相同的内容。这是一种反模式,因为它导致代码很难维护


    您应该将通用单元测试代码集中在一个测试方法中,如果您想要相同的测试逻辑但用于不同的“示例”,则应使用该方法。

    Spock现在允许在
    中使用helper方法,然后:
    块-来自:

    def“提供的电脑与首选配置匹配”(){
    什么时候:
    def pc=shop.buyPc()
    然后:
    matchesPreferredConfiguration(pc)
    }
    def匹配参考配置(pc){
    pc.vendor==“Sunny”
    &&pc.clockRate>=2333
    &&pc.ram>=4096
    &&pc.os==“Linux”
    }
    
    或者使用更好的错误消息:

    void matchesPreferredConfiguration(pc){
    断言pc.vendor==“Sunny”
    断言pc.clockRate>=2333
    断言pc.ram>=4096
    断言pc.os==“Linux”
    }
    
    当:
    然后:
    等块出现在helper方法中时,使用
    是没有任何意义的,它们应该只在feature方法中使用。您错误地假设我使用Spock进行单元测试。事实并非如此,我也将其用于e2e测试,在e2e测试中,某些测试步骤可以共享,而与中断的测试设计无关。
    
    def cleanup() {}        // run after every feature method
    
    def cleanupSpec() {}    // run after the last feature method