Spocklight: Mocks And Stubs Returning Sequence of Values
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.