2011-07-20 274 views
0

在我的一個單元測試中,我遇到了一些難以獲得模擬方法來執行。我有以下的測試代碼:模擬Grails單元測試的方法

void testExample() { 
    def mockICFService = new MockFor(ICFService) 
    ... 

    //Mock the methods 
    controller.metaClass.icfList = { def person -> 
     println "icfList" 
     return [new IC(conceptId:'12345')] 
    } 
    mockICFService.demand.getAllIC(1..1) { def id, def withHist, def appId -> 
     println "mocking service" 
     return new Person() 
    } 
    ... 

    def model = controller.detail() 
} 

裏面的細節在我的控制器類創建通過ICFService的getAllIC一個Person()。這部分工作正常。然而,在函數的後面,有一個icfList(在控制器中定義)的調用。通過println,我確定調用仍在進行中,儘管它正在返回一個空數組。我相信這是因爲數組是基於servletContext中的數據填充的,但在單元測試中沒有訪問(因此我試圖嘲笑它)。

有誰知道如何強制測試使用controller.icfList的模擬版本,而不是調用控制器中的實際方法?

回答

1

當我嘗試你的代碼時,嘲笑我的是模擬服務,正常工作的部分是嘲笑icfList()方法。有趣的是,你觀察的相反。對於它的價值,這裏是我所做的:

首先用mockFor()方法替換新的MockFor()類實例化。然後你需要將模擬服務注入控制器。

def mockICFService = mockFor(ICFService) 
controller.iCFService = mockICFService.createMock() 

通過做好以上,僅icfList()和getAllIC的嘲笑版本()被調用,這樣你就不會使用ServletContext中的。查看Grails testing documentation瞭解更多信息。

+0

感謝您的幫助喬丹!我確實設法通過在mockFor上使用你的建議來工作,並且對我嘲弄getICF()的方式做了一些小的改變(主要確保我在正常控制器中重寫它)。 –

+0

很高興工作! –