我正在编写grails集成测试,调用一个控制器,该控制器调用一个调用另一个调用另一个服务的服务的服务。
Controller -> ServiceA.method1() -> ServiceB.method2() -> ServiceC.method3()
要调用的最后一个服务中的最后一个方法(ServiceC.method3()
)调用外部世界(另一个JVM)并返回一个结果,我想模拟出我的集成测试。所以我仍在测试该特定服务方法的链接。
我正在阅读Grails中的嘲讽,但似乎只有在单元测试中才有可能。
有关如何推进这个的提示吗?
答案 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