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

时间:2015-01-07 23:16:13

标签: grails testing gorm

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

我该如何测试这项服务?

该服务的一个例子是:

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

我不关心,在单元测试的上下文中,是否有保存到数据库。我只是想知道它被称为。

1 个答案:

答案 0 :(得分:1)

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

如果您要验证的是调用了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不会选择你的,它会调用真正的方法。