Search code examples
unit-testinggrailsgroovyspock

mock out return of a method base on the number of invocation only in spock


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.


Solution

  • 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
        }
    }