2014-07-02 29 views
1

我想測試哪些對我的領域類調用方法getUrl()服務:如何模擬Grails Domain類的特定方法?

服務類:

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爲空),當我跑我的測試。

所以,我明白我需要在我的域類中嘲笑這個getUrl()方法。

我們該如何模擬這種方法來調用我的單元測試?

+0

您需要分享您遇到問題的測試。沒有它,很難說。但我想你只需要創建'PersonService'模擬。 – Opal

回答

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" 
    
+0

感謝您糾正我:它實際上是一個鏈接()方法,而不是createLink(),我會編輯它。 我擔心的是我應該模擬Person的每個實例。這是我想避免的(如果可能的話)。 –

+0

很難說..這取決於你的上下文。通常情況下,你不應該有太多真正需要getUrl()方法的測試。如果測試沒有調用getUrl(),則不需要設置grailsLinkGenerator。我可能會將鏈接創建(即對grailsLinkGenerator的依賴)移出Person。也許是一個「PersonUrlBuilder」或類似的東西。人看起來對我來說不合適。 –