2009-10-09 354 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