12

Is it possible to mock out the return value of a method in spock based on the nth time it was called? Note that I don't want to specify the parameters passed in because it does not matter for a specific test case.

For example, for the first call it should return x, for the second call it should return y.

froi
  • 7,268
  • 5
  • 40
  • 78
  • Quite strange requirement. It isn't possible out of the box, what You need/want to achieve? What is the scenario? – Opal Nov 04 '14 at 14:15
  • @Opal I have a service method that I iterate over until that method returns a specific value, now I just need to verify if the iterating process/ loop works as expected. – froi Nov 04 '14 at 14:18

1 Answers1

18

Yes it is possible.

someObject.someMethod(*_) >>> [ 'x', 'y' ]

It will return x on first invocation and y on second invocation of the method.

Example:

void "test something"() {
    given:
    def sample = Mock(Sample) {
        someMethod(_) >>> ['Hello', 'World']
    }

    expect:
    sample.someMethod('foo') == 'Hello'
    sample.someMethod('bar') == 'World'
}

class Sample {
    def someMethod(def a) {
        return a
    }
}
dmahapatro
  • 49,365
  • 7
  • 88
  • 117