lucke84
lucke84

Reputation: 4636

Too few interactions in a Spock test for a Grails service

I thought I've understood Spock interactions but I have to admin that I'm still missing some pieces of the picture.

Alright, here my problem: I have a method in a Grails service which performs some operations, including a call to a void method of the same service class. Here's the code:

class myService {
    void myStuff(def myObj, params) {
        // do my stuff

        anotherMethod(myObj)

        //do my stuff again
    }

    void anotherMethod(myObj) {
        // do other stuff
    }
}

I want to be sure that myStuff method calls anotherMethod, to test and document the correct behaviour.

So, here's the test in my Spock Specification class:

void 'test myStuff method'() {
    given: 'my object and some params'    
        // doesn't really matter what I'm doing here
        MyObject myObj = new MyObject()
        params = [title: 'my object']

    when: 'we call myStuff()'
        service.myStuff(myObj, params)

    then: 'anotherMethod() is called exactly one times'
        1 * service.anotherMethod(myObj)
    }
}

The error I get is:

Too few invocations for:

1 * service.anotherMethod(myObj)   (0 invocations)

What do you think? What's wrong?

As always, thanks in advance.

Upvotes: 2

Views: 2408

Answers (1)

Peter Niederwieser
Peter Niederwieser

Reputation: 123890

You are asking for a very special, and generally discouraged, form of mock called partial mocking where methods on the class under test are mocked. Spock supports this since 0.7, but you'll have to create a Spy() rather than a Mock(). Also note that you cannot mock private methods. For more information on spies, see the reference documentation.

Upvotes: 4

Related Questions