2016-12-15 15 views
1

當爲Grails 3中的某個類編寫單元測試時,我可以使用@TestFor註釋來指定我想測試的類。在我的單元測試中,如果我的測試服務是一個控制器和一個字段「服務」,並且我可以使用這些字段作爲「測試中的系統」,那麼我有一個字段「控制器」。@TestFor在域單元測試中做了什麼?

我想知道什麼@TestFor正在做一個域類的測試和它應該如何使用。我找不到處理這種情況的任何文檔。比方說,我有一個域「MYDOMAIN」,並啓動這樣一個測試「MyDomainSpec」:

@TestFor(MyDomain) 
class MyDomainSpec extends Specification { 

    def setup() { 
     def doesntMatter = domain // just to check access to "domain" 

最後一行已經給了我一個

org.codehaus.groovy.runtime.typehandling。 GroovyCastException:不能與類的java.lang.Class中的「投對象類MYDOMAIN'上課「MYDOMAIN」

這可能意味着Grails的嘗試使用表示MYDOMAIN類爲這個類的一個實例的對象。我想知道爲什麼會發生這種情況,代碼有什麼問題?我的意思是,domain屬性存在,它確實是有原因的,不是嗎?我怎樣才能使用僅僅訪問它時拋出異常的屬性?

更新
顯然引發異常只有在域類中有一個字段String name。我不知道這個領域應該如此特別。它可能只是一個錯誤?

+0

這似乎是一個有用的文章。他們在域類上使用'@ TestFor' http://www.christianoestreich.com/2012/11/domain-constraints-grails-spock-updated/ – zero01alpha

+1

@ zero01alpha這是一個有趣的閱讀本身,謝謝。但是關於TestFor,他們只提到它使得方法「mockForConstraintsTests」可用。 – Matthias

回答

2

@TestFor批註爲Grails域類做了很多事情,但最重要的是它嘲弄了域的行爲和GORM功能,並提供了一個返回域類的實例的getter。

域類被註冊爲原型的Spring beans,所以吸氣只是要求一個新實例的應用程序上下文,然後設置一個實例到這是對後續調用getter返回的私人$domain場。請注意,您的def doesntMatter = domain正在使用此生成的吸氣劑,相當於def doesntMatter = getDomain(),其中getDomain()返回MyDomain的新實例。

這聽起來像你的假設是正確的。調用getter不應該導致異常。以下工作正常:

@TestFor(MyDomain) 
class MyDomainSpec extends Specification { 

    void "a new domain can be saved"() { 
     given: "a new instance of MyDomain" 
     def d = domain // or getDomain() 

     expect: 
     d.id == null 

     when: 
     d.save() 

     then: 
     d.id != null 
    } 
} 

@Entity 
class MyDomain { 

} 

編輯: 這是關係到Grails中的錯誤,並應固定在下一版本中,看到https://github.com/grails/grails-core/issues/10363

+0

謝謝!你的代碼也適用於我。你確定「每次請求時getter只是詢問新實例的應用上下文」嗎?我的調試器告訴我,否則 - 我得到相同的實例連續用於域或getDomain。關於CastException:顯然,當MyDomain中有一個字段「String name」時會發生這種情況。奇怪... – Matthias

+0

對不起,我的錯。如果私有'$ domain'字段不爲空,那麼getter只會從應用程序上下文中請求一個新實例。所以你會得到相同的實例,除非你明確設置了'$ domain = null'。 – dpcasady

+0

好的我也看到'GroovyCastException'和'String name'。我會試着找出原因。 – dpcasady

相關問題