2009-10-09 86 views
3

我想測試一個調用服務的Grails控制器。我想嘲笑這項服務。該服務有一個方法:需要Grails單元測試幫助

JobIF JobServiceIF.getJob(int)

和JobIF有一個方法:

String JobIF.getTitle()

這裏是我的控制器

 
def workActivities = { 
    JobIF job = jobService.getJob(params.id) 
    [career:job] 
} 

我明白,我需要模擬服務工作類(這兩者都有具體的實現),但我正在努力爭取Groovy模擬的頭腦對象語法。我如何嘲笑一項工作並將標題設置爲某項內容,如「Architect」,然後測試代碼?

到目前爲止,我有:

 
void testWorkActivities() { 
    def controller = new CareersController() 
    ... // Mocking stuff I don't know how to do 
    controller.params.id = 12 
    def model = controller.workActivities() 
    assertEquals "Architect", model["career"].getTitle() 
} 

回答

6

你基本上有兩種選擇

  1. 使用Groovy中通過調用mockFor方法嘲諷類,即MockForStubFor
  2. 使用Grails模擬類GrailsUnitTestCase。通過此方法返回的類是一個實例GrailsMock

就我個人而言,我發現Groovy模擬對象比Grails mock更可靠。有時候,我發現我的Grails模擬對象被繞過了,儘管我似乎正在正確設置所有東西。

下面是如何使用Groovy的嘲笑一個例子:

void testCreateSuccess() { 

    def controller = new CareersController() 

    // Create a mock for the JobService implementation class 
    def mockJobServiceFactory = new MockFor(JobService) 

    mockJobServiceFactory.demand.getJob {def id -> 
     // Return the instance of JobIF that is used when the mock is invoked 
     return new Job(title: "architect") 
    } 

    // Set the controller to use the mock service 
    controller.jobService = mockJobServiceFactory.proxyInstance() 

    // Do the test 
    controller.params.id = 12 
    def model = controller.workActivities() 
    assertEquals "Architect", model["career"].getTitle() 
} 

的過程中使用的Grails的嘲笑時,基本上是相同的,但你調用測試類的mockFor方法,而不是實例MockFor

+0

謝謝。我能再問一個問題嗎?如果JobService有一個構造函數參數 - 我該如何指定?例如,JobService將JobDao作爲其構造函數arg。謝謝。 – Matt 2009-10-12 13:22:44

+0

的方式堆棧跟蹤是: 測試用例:testWorkActivities了0.344秒 \t導致錯誤 無法找到這個列表來調用的方法(): 公共uk.co.cascaid.biz.job.JobObservableCachedService# (uk.co.cascaid.dao.job.JobDaoIF,uk.co.cascaid.biz.common.paging.PageCollectionServiceIF) public uk.co.cascaid.biz.job.JobObservableCachedService#(uk.co.cascaid。 dao.job.JobDaoIF) org.codehaus.groovy.runtime.metaclass.MethodSelectionException: – Matt 2009-10-12 14:28:44