spock框架中的高级辅助方法

时间:2016-09-24 14:05:49

标签: java groovy spock

我使用Spock框架。我知道可以封装来自then:块的逻辑的辅助方法。我需要的是在同一个类中的不同特征方法之间重用几行代码。这些代码行包​​含when:then:块,例如:

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

    when:
    ...

    then:
    ...

    myHelperMethod
}

private void myHelperMethod() {
    when:
    ...

    then:
    ...
}

据我所知,Spock目前无法实现这一目标。有没有可用的解决方法来实现相同的目标?

3 个答案:

答案 0 :(得分:0)

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

使用时:是我们想要检查的条件。

使用 then:是我们希望获得的结果。

对于具有相同条件的相同时间块, then:块的行为应该具有相同的结果。

最佳做法是省略 then:块中的一个(可能在第一次检查后,您可以找到其中一个无关紧要)。 省略不相关的然后块后,您可以合并2 时:块。

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

可以通过两种方式完成:

  1. 使用常用方法,例如:
  2. def cleanup() {}        // run after every feature method
    
    def cleanupSpec() {}    // run after the last feature method
    
    1. 在相关测试中使用清理:块。清理时应保留时: 阻止来自 myHelperMethod(),而 then:块应该被省略,因为检查对于检查来说不是那么重要。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

Spock现在确实允许def "offered PC matches preferred configuration"() { when: def pc = shop.buyPc() then: matchesPreferredConfiguration(pc) } def matchesPreferredConfiguration(pc) { pc.vendor == "Sunny" && pc.clockRate >= 2333 && pc.ram >= 4096 && pc.os == "Linux" } 块中的辅助方法-来自documentation

void matchesPreferredConfiguration(pc) {
  assert pc.vendor == "Sunny"
  assert pc.clockRate >= 2333
  assert pc.ram >= 4096
  assert pc.os == "Linux"
}

或者带有更好的错误消息:

wal_checkpoint