验证是否在服务测试中调用了保存

Verifying that a save was called in a Service Test

我正在使用 Grails 2.4,我有一个帮助服务,它创建一个特定的域类,设置它周围的依赖关系,然后最终将对象保存到数据库中,在一个承诺中。

我将如何测试这项服务?

该服务的示例是:

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()
  } 
}

我不在乎,在单元测试的上下文中,是否保存到数据库。我只想知道它被调用了。

你必须做一些事情来等待异步调用完成,但这是一个单独的问题。

如果你想验证的只是保存被调用,而不是对象是否真的被持久化,我会用元类来做:

在集成测试中调用 persist 方法之前,添加:

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

并在您的 Spock then 块中或您进行验证调用的任何地方添加

assert saveCalled

请注意,元类 save 闭包的签名必须与实际调用的签名相匹配。你显示它被调用时没有 args,但是如果你调用 save(flush:true) 那么你传递的是 Map arg 并且签名必须是

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

否则Groovy不会选择你的,它会调用真正的方法。