Search code examples
grailstestinggrails-orm

Verifying that a save was called in a Service Test


I'm using Grails 2.4 and I have a helper service that creates a specific domain class, sets up the dependencies surrounding it and then finally saves the object to the database, within a promise.

How would I test this service?

An example of the service is:

def persist(name, objectId, depTwoId) {
  Person p = Person.findByName(name)
  Object o = Object.findById(objectId)

  RepObject rob = RepObject(p, o) //Ok you get the idea here

  def task = Promises.task { 
     rob.save()
  } 
}

I don't care, within the context of the unit test, if there was a save to the database. I just want to know that it was called.


Solution

  • You'll have to do something to wait for the async call to finish, but that's a separate issue.

    I'd do it with the metaclass if all you want to verify is that save is called, but not that the object is actually persisted:

    Before you call the persist method in your integration test, add this:

    boolean saveCalled = false
    RepObject.metaClass.save = { -> saveCalled = true }
    

    and in your Spock then block or wherever you do verification calls, add

    assert saveCalled
    

    Note that the signature of the metaclass save closure has to match what's actually called. You show it being called with no args, but if you call save(flush:true) then you're passing a Map arg and the signature would have to be

    RepObject.metaClass.save = { Map m -> saveCalled = true }
    

    otherwise Groovy won't choose yours, it will call the real method.