需要仅在集成测试中模拟一种服务方法

时间:2014-02-06 17:39:57

标签: grails groovy mocking integration-testing

我正在编写grails集成测试,调用一个控制器,该控制器调用一个调用另一个调用另一个服务的服务的服务。

Controller -> ServiceA.method1()  -> ServiceB.method2() -> ServiceC.method3()

要调用的最后一个服务中的最后一个方法(ServiceC.method3())调用外部世界(另一个JVM)并返回一个结果,我想模拟出我的集成测试。所以我仍在测试该特定服务方法的链接。

我正在阅读Grails中的嘲讽,但似乎只有在单元测试中才有可能。

有关如何推进这个的提示吗?

2 个答案:

答案 0 :(得分:3)

使用metaClass覆盖方法的功能。我在集成测试中一直这样做,这是我的模拟方式。

所以在你的测试方法中做这样的事情(注意方法arg类型必须与真实方法完全匹配):

controller.serviceA.serviceB.serviceC.metaClass.method3 = { Args args ->
    // do whatever you want here, set flags to indicate method called,
    // assert args, declare return types, etc
    // return 'mocked' result
}

确保在集成测试拆卸方法中重置此服务的metaClass,否则所有其他int测试将具有相同的定义:

controller.serviceA.serviceB.serviceC.metaClass = null

答案 1 :(得分:1)

  

我正在阅读Grails中的嘲笑,但它似乎只是   可以在单元测试中使用。

这当然不是真的。 您可以在单元测试和集成测试中使用Groovy中可用的所有模拟方法。

使用Map强制进行模拟,可能很容易:

controller.serviceA.serviceB.serviceC = [method3: {return 'MockValue'}] as ServiceC