如何模拟Grails Domain类的特定方法?

时间:2014-07-02 11:57:40

标签: unit-testing grails mocking spock

我试图在我的域类上测试调用方法getUrl()的服务:

服务类:

PersonService {

  //WE WANT TO TEST THIS METHOD. 
  String getPersonLink(Person person){
     person.url
  }
}

class Person {

   static transient LinkGenerator grailsLinkGenerator

   String name 
   String uniqueId

   static transients = ['url']

   String getUrl() {
     grailsLinkGenerator.createLink(controller:'xyz', action: 'index', id: uniqueId)
   }
}

我运行测试时得到NullPointerException(它发现grailsLinkGenerator为null)。

所以,我知道我需要在我的域类中模拟这个getUrl()方法。

我们如何模拟这个方法调用我的单元测试?

1 个答案:

答案 0 :(得分:3)

  • 您必须删除static。您无法自动静电。如果您写LinkGenerator grailsLinkGenerator,则必须将grailsLinkGenerator添加到瞬变中。否则hibernate会尝试保存它。只需编写def grailsLinkGenerator即可避免这种情况。

  • 没有createLink()方法,称为link()

  • 在单元测试中,bean没有自动装配。您必须使用以下内容设置grailsLinkGenerator

    def p = new Person()
    p.grailsLinkGenerator = Mock(LinkGenerator)
    

    然后你可以存根/模拟link()(不确定你要测试什么,所以这只是一个例子):

    p.grailsLinkGenerator.link (_) >> "foo"