【发布时间】:2016-02-01 20:09:28
【问题描述】:
我有一个 Grails (3+) 服务,从数据库中检索域对象,修改,然后在数据库中更新。
class MyService {
def modifyObject(String uuid) {
def md = MyDomain.findByUuid(uuid)
md.someField = true
if (!md.save()){
throw new MyException()
}
}
}
现在我需要用否定测试来测试这个服务方法,以确保抛出异常。但我不知道如何在服务方法中强制失败的save。
@TestFor(MyService)
@Mock(MyDomain)
class MyServiceSpec extends Specification {
void "test An exceptionl situation was found"() {
given: "An uuid"
def md = new MyDomain(uuid: "123")
md.save(failOnError: true)
when: "service is called"
service.modifyObject("123")
then: "An exception is thrown"
thrown MyException
}
}
显然,以更实用的方式重新定义服务方法(对象直接传递给方法,修改并返回不保存.例如MyDomain modifyObject(MyDomain md))将是一个很好的解决方案,因为我可以在外部创建一个无效的 ad hoc 对象,甚至在方法执行后使其无效。
但问题是:“有没有办法按原样测试服务代码?”
【问题讨论】:
-
违反对 MyDomain 的约束并且保存应该失败,不是吗?如果 modifyObject 真的那么简单(你不能传入一个虚假的值来强制违反约束),也许你需要对 MyDomain.save 进行 metaClass 并在那里强制失败。
-
@railsdog 如果您提供完整的工作答案,我可以接受
标签: unit-testing grails spock