Programming for fun and profit

Programming tutorials, problems, solutions. Always with code.

Spock Framework Given When Then Where


How to use Spock‘s where block to parametrize given-when-then tests?


where block is Spock Framework‘s power feature. It allows to test thoroughly in very easy way, using many different values.

One way to declare where block is to use very readable table syntax, like here:

def 'should sort list of numbers'() {
    def list = [a, b]

    def calculated = list.sort()

    calculated == expectedResult

    a | b | expectedResult
    5 | 1 | [1, 5]
    9 | 9 | [9, 9]

The test could be shorter, but just to show that values from where block can be used around the test.

Another way to iterate over test data is to use Groovy “<<” operator that takes subsequent values from a collection. The following test initializes test values with subsequent elements from both lists at the same time:

def 'should compute the maximum of two numbers'() {
    Math.max(a, b) == c

    a << [1, 4]
    b << [2, 3]
    c << [2, 4]

In my experience the table form of expressing where blocks is often more readable.

Share with the World!