如果在spock测试中条件,我们可以在里面写`when` /`then`

时间:2016-12-12 10:12:05

标签: java groovy spock specifications

我们可以在spock测试条件下写when / then吗?代码看起来像这样。在这里,我试图控制时间和时间的调用。

def testMethod(){
    given:
        if(some Condition) {
            when:
                eventOne Occurred
            then:
                assertion based on eventOne
        } else if (some Condition) {
            when:
                eventTwo Occurred
            then:
                assertion based on eventTwo
        } else {
            when:
                eventThree Occurred
            then:
                assertion based on eventThree
        }
    where:
        iteration here.
}

2 个答案:

答案 0 :(得分:2)

这是为了什么目的? given-when-then方法旨在使自动化测试更易于理解。您展示的示例使阅读和理解您的测试变得困难。我甚至打赌它不会编译。

尝试简化测试。 where用于为测试提供参数(参数化测试),例如

@Unroll    
def "should return #result for parameters(#a,#b)"() {

    when:
        def result = someObject.someMethod(a, b)

    then:
        result == expected

    where:
        a           | b             || expected
        null        | null          || false
        ""          | ""            || false
        "test"      | "foo"         || true
}

这里的主要目的是尽可能简单地理解测试逻辑。如果您想测试不同的组合,那么您可以创建单独的测试方法。

答案 1 :(得分:1)

从Spock的角度来看,我找不到您的具体示例的任何限制。从可读性的角度来看,我不认为这是使用Spock的最佳方式 - 我同意上面的回答。

但请注意Spock标签的以下限制(来自here):

  

要素方法必须至少有一个显式(即标记)块    - 事实上,显式块的存在是使方法成为特征方法的原因。块将方法划分为不同的部分,并且   无法嵌套

所以从逻辑上讲,你可以把你的例子看作:

  1. 给出 - 是一个设置阶段;
  2. when-then from first condition;
  3. when-then from the second condition;
  4. when-then from the third condition;
  5. 其中 - 描述数据供应;