2011-03-06 74 views
5

我想測試控制器使用正確的參數調用service方法。什麼是最好的方式來做到這一點?Grails mockFor以及如何測試該方法使用正確的參數調用

我目前的計劃是使用mockFor,然後通過閉包檢查傳入的值。是否有更好的方法通過mockFor或模擬對象執行測試,類似於我可以使用mockito執行相同方法調用參數值測試?

class HappyControllerTests extends ControllerUnitTestCase { 
     : 
    void testSomeValue() { 
     def mockControl = mockFor(HappyService) 
     def givenSomeItem = null 
     mockControl.demand.serviceMethod(1..99) { String someItem -> givenSomeItem = someItem; } 
     controller.happyService = mockControl.createMock() 

     controller.someAction() 

     mockControl.verify() 
     assertEquals("specific value", givenSomeItem) 
    } 
} 

謝謝!

+0

我喜歡「泰德Naleid」的答案。然而,恕我直言,大型商店應該使用mockFor(..)參見http://grails.org/doc/latest/guide/9.%20Testing.html#9.2集成測試「...使用這些方法可確保您做出的任何更改給定的類別不會泄漏到其他測試中。「 – finneycanhelp

回答

13

我很少用mockFor因爲我發現Groovy的內置元類的東西,as ClassName更容易的工作與越來越強大,我應該這樣做:

void testSomeValue() { 
    def givenSomeItem = null 
    controller.happyService = [ 
     serviceMethod: { String someItem -> givenSomeItem = someItem } 
    ] as HappyService 

    controller.someAction() 
    assertEquals "specific value", givenSomeItem 
} 
+1

感謝您的代碼示例。這也是我的觀點,直到發生一些事情:1)我參加了傑夫布朗的精彩演講並與他交談。 2)在測試的setup()中,我看到metaClass有時會對某個類的所有實例進行操作,但未正確還原。這最終導致了跨測試的副作用行爲,我是追捕發生的事情的人。所以..雖然可能只是使用Groovy metaClass來實現對象模擬,而對於其他模型,我建議在大型Java商店中使用mockFor。 – finneycanhelp

+1

如果您更改類上的metaClass,通常會遇到您正在討論的問題。如果你只是修改一個實例(就像上面的例子一樣),它幾乎總是安全的,只要實例存在,變化就會一直存在。我唯一遇到這個問題的時候是當我嘲笑注入一個單例的spring實例時。同一個實例已經注入其他地方,所以我的更改在測試後不會被丟棄。我並不完全不同意你的看法,即使人們對groovy不太熟悉,mockFor在一家大型Java商店中可能會更好。 –

+0

這真的很棒 – tbruyelle

相關問題