2014-02-06 24 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 
相關問題