Creating and working with mocks and stubs in Spock is easy. If we want to interact with our mocks and stubs we have several options to return values. One of the options is the triple right shift operator >>>
. With this operator we can define different return values for multiple invocations of the stubbed or mocked method. For example we can use the >>>
operator followed by a list of return values ['abc', 'def', 'ghi']
. On the first invocation abc
is return, the second invocation returns def
and the third (and following) invocation(s) return ghi
.
In the following specification we have a class under test StringUtil
. The class has a dependency on an implementation of the Calculator
interface. We mock this interface in our specification. We expect the calculateSize
method is invoked 5 times, but we only provide 3 values for the invocations. This means the first time 1
is used, the second time 3
is used and the remaining invocations get the value 4
:
package com.mrhaki.spock @Grab('org.spockframework:spock-core:1.0-groovy-2.4') import spock.lang.Specification import spock.lang.Subject class SampleSpec extends Specification { @Subject def util = new StringUtil() def "Calculate sizes of String values"() { given: def calculator = Mock(Calculator) util.calculator = calculator when: def total = util.size('one', 'two', 'three', 'four', 'five') then: 5 * calculator.calculateSize(_) >>> [1,3,4] total == 1 + 3 + 4 + 4 + 4 } } class StringUtil { def calculator int size(final String[] s) { s.sum { calculator.calculateSize(it) } } } interface Calculator { int calculateSize(final String s) }
Written with Spock 1.0-groovy-2.4.