如何在 Spock 规范的 'where:' 块中指定范围而不是列表?

12

以下是示例代码:

class MySpec extends spock.lang.Specification {
    def "My test"(int b) {
        given:
        def a = 1

        expect:
        b > a

        where:
        b << 2..4
    }
}

使用列表而不是范围时会引发以下编译错误:“where-blocks may only contain parameterizations (e.g. 'salary << [1000, 5000, 9000]; salaryk = salary / 1000')”

但如果使用列表而不是范围:

        where:
        b << [2,3,4]

编译并按预期运行得很好。

我能否通过某种方式指定一个范围?

1个回答

14

使用

where:
b << (2..4)

这个测试也可以进行以下优化。注意测试中没有参数。

def "My test"() {
  expect:
  b > a

  where:
  a = 1
  b << (2..4)
}

1
谢谢!你为什么需要括号有什么见解吗? - AndrewW
5
<<的优先级高于..,所以b << 2..4被解释为(b << 2)..4。这会失败,因为2不是可迭代的,导致程序在此之前失败。请参见http://docs.codehaus.org/display/GROOVY/JN2535-Control。 - Luis Muñiz
1
感谢提供链接和解释。在文档中,它们位于同一行(<< >> >>> .. ..<)。这是否意味着它们具有相同的优先级,因此按从左到右的顺序进行解释,导致失败?这对我也很有道理。 - AndrewW
1
我经常希望 .. 有更高的优先级,我经常因为不能执行 1..2.each { println it } 而感到恼火。 - tim_yates
这里有一个类似于你的情况 1..2.with { it * 2 } :) - dmahapatro
不要忘记使用@Unroll注释! - nicoabie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接