2010-05-24 93 views
7

我想測試一個「withCriteria」的封閉,我不知道如何去做。我看到了如何模擬withCriteria調用,但不測試閉包內的代碼。在運行執行「withCriteria」的測試時,即使代碼在正常執行流程下運行良好,我仍然會收到MissingMethodException。有任何想法嗎? 謝謝! SteveGrails with Criteria testing

回答

14

我不會去那條路線。相反,我會將查詢作爲靜態查找方法移動到域類中,並直接在具有真實數據的集成測試中進行測試。然後,當在控制器或服務測試中調用輔助方法時,您可以輕鬆地進行模擬。

class YourDomainClass { 

... 
    static List<YourDomainClass> findFooBar() { 
     YourDomainClass.withCriteria { 
     ... 
     } 
    } 
} 

然後在單元測試:

def results = [instance1, instance2, instance3] 
YourDomainClass.metaClass.static.findFooBar = { -> results } 

這樣你測試的查詢工作對在集成測試的內存數據庫,但它很容易嘲笑它的單元測試。

0

目前還沒有Hibernate標準的模擬實現。你需要使用集成測試。但是,Burt建議將這種靜態查找方法用於代碼組織。您還應該查看在http://www.grails.org/1.2+Release+Notes中描述的命名查詢,以獲得一個很好的語法。

1

繼伯特的答案,看看命名查詢,如下所述:

http://blog.springsource.com/2010/05/24/more-grails-1-3-features/

然後你可以嘲笑你的單元測試的屬性/方法訪問由伯特描述。

+3

命名查詢是偉大的,但我不能嘲笑他們的單元測試。你有沒有得到這個工作,或者你堅持進行集成測試? – j4y 2012-03-06 18:52:15

1

由於沒有人提到創建DSL來運行其他DSL的選項,因此這裏全面介紹了這種方法。我經常使用它,結果非常好。

Groovy/Grails testing DSLs