2010-10-30 19 views
10

有具有自定義靜態函數從數據庫中如何在Grails中模擬一個域對象的靜態方法?

class Foo { 
    /* member variables, mapping, constraints, etc. */ 

    static findByCustomCriteria(someParameter, List listParameter) { 
     /* code to get stuff from the database... */ 

     /* 
      Return value is a map 
      ["one": "uno", "two": "due", "three": "tre"] 
     */ 
    } 

} 

靜態函數findByCustomCriteria使用createCriteria()建立從符表中提取數據的查詢,這意味着抓住數據的Grails域對象mockDomain(Foo)不起作用當單元測試正確時。我想要解決這個問題的方法是使用嘲笑的通用方法之一來剔除findByCustomCriteria,但我無法理解語法。

我有一個控制器BarController,我試圖測試,並埋在呼叫BarController.someFunction()有一個電話Foo.findByCustomCriteria()

class BarControllerTest extends ControllerUnitTestCase { 

    protected void setUp() { 
     super.setUp() 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testSomeFunction() { 

     /* Mocking for Foo goes here */ 

     assertEquals("someValue", controller.someFunction()) 
    } 
} 

什麼樣的方法來嘲笑這件事?

我試過使用new MockFor()mockFor()metaClass,但我無法讓它工作。


編輯:

每次我試圖嘲弄了這一點,我試圖嘲弄它是這樣的...

Foo.metaClass.'static'.findByCustomCriteria = { someParam, anotherParam -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

我想我起初並沒有包括足夠的信息。

+0

把嘲笑和foo的東西放在......這就是我們需要看到的幫助 – hvgotcodes 2010-10-30 00:13:58

回答

14

我遇到不止一次這種情況更多,你需要修改靜態 metaClass上的Foo:

Foo.metaClass.'static'.findByCustomCriteria = { someParameter, List listParameter -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

通常我會把它放在測試設置,所以我不會忘記何時需要應用。

+0

此解決方案不起作用。我正在更新相應的問題。 – haydenmuhl 2010-11-01 18:52:46

+0

@haydenmuhl:我更新瞭解決方案以包含一個明確的參數(我假定隱式參數是足夠的,但也許不是,這可能是問題(即方法重載簽名))。請再試一次。 – 2010-11-01 20:04:45

+0

您的解決方案可能會奏效,但我沒有在我的問題中包含正確的信息。我使用的方法簽名是錯誤的。它實際上採用了一個對象和一個列表,我嘲笑它爲兩個對象。我會更新這個問題。如果你更新你的答案,我會選擇它是正確的。 – haydenmuhl 2010-11-01 20:56:40

4

在Grails的2.0及更高版本,可以使用GrailsMock類這樣

def mockControl = new GrailsMock(MyDomainClass) 
mockControl.demand.static.get() {id -> return null} // Static method 
... 
mockControl.verify() 

here

相關問題