【问题标题】:Advanced helper methods in spock frameworkspock 框架中的高级辅助方法
【发布时间】:2016-09-24 14:05:49
【问题描述】:

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

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

    when:
    ...

    then:
    ...

    myHelperMethod
}

private void myHelperMethod() {
    when:
    ...

    then:
    ...
}

据我了解,Spock 目前无法做到这一点。是否有任何解决方法可以实现相同的目标?

【问题讨论】:

  • 在辅助方法中使用when:then:等块没有任何意义,它们只能用于特征方法中。

标签: java groovy spock


【解决方案1】:

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

when: 的使用是针对我们希望检查的条件。

then:的使用是为了我们想要得到的结果。

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

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

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

这可以通过两种方式完成:

  1. 使用常用方法,例如:
def cleanup() {}        // run after every feature method

def cleanupSpec() {}    // run after the last feature method
  1. 在相关测试中使用 cleanup: 块。清理应该保持 when: myHelperMethod() 中的块,而 then: 块应该被省略,因为检查对于检查来说应该不是那么重要。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你做了一个错误的假设,我使用 Spock 进行单元测试。情况并非如此,我也将它用于 e2e 测试,其中某些测试步骤可以共享,并且与损坏的测试设计无关。
    【解决方案3】:

    Spock 现在确实允许在 then: 块中使用辅助方法 - 来自 documentation

    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"
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多