2014-02-06 25 views
0

我正在编写一个呼叫给控制器的grails集成测试,该控制器调用一个调用另一个调用另一个服务的服务的服务。只需要在集成测试中模拟一种服务方法

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

在最后一个服务的最后一个方法被调用(ServiceC.method3())使得向外界通话(另一个JVM)并返回结果,这是我想要模拟出我的集成测试。所以我仍然在测试这个特定服务方法的链条。

我在阅读Grails中的嘲讽,但它似乎只能在单元测试中使用。

任何提示如何推进这一个?

+1

提示:1.豆类是自动连线的集成测试。 2.'metaClass'可以用来添加/模拟行为。 – dmahapatro

回答

3

使用元类覆盖一个方法的功能。我一直在我的集成测试中这样做,以此来模拟。

在您的测试方法

所以做这样的事情(注意方法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 
} 

请确保您的集成测试推倒方法重置元类这项服务,否则所有其他的int测试将具有相同的定义:

controller.serviceA.serviceB.serviceC.metaClass = null 
1

我正在读嘲弄grails,但它似乎只有 可能在单元测试。

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

随着使用地图强迫嘲讽,也可以是这样简单:

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