我想测试一个调用服务的Grails控制器。我想嘲笑这项服务。该服务有一个方法:
JobIF JobServiceIF.getJob(int)
和JobIF有一个方法:
String JobIF.getTitle()
这是我的控制器
def workActivities = { JobIF job = jobService.getJob(params.id) [career:job] }
我知道我需要模拟服务和作业类(两者都有具体的实现),但我很难理解Groovy模拟对象的语法。我如何模拟一个工作并将标题设置为某个东西,说“架构师”,然后测试代码?
到目前为止,我有:
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() }
答案 0 :(得分:6)
你基本上有两个选择
MockFor
和StubFor
mockFor
的{{1}}方法来使用Grails模拟类。此方法返回的类是GrailsUnitTestCase
就个人而言,我发现Groovy模拟对象比Grails模拟更可靠。有时,我发现我的Grails模拟对象被绕过了,即使我似乎正确地设置了一切。
以下是如何使用Groovy模拟的示例:
GrailsMock
使用Grails模拟时,该过程基本相同,但您调用测试类的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()
}
方法,而不是实例化mockFor
。