2010-10-02 143 views
0

在Groovy中使用模擬支持來測試與依賴關係的協作時,我遇到了一個有趣的問題。我們有兩個類(例如):Groovy MockFor - 如何處理對「模仿」方法的調用

class Dependency { 

    void method() { 
     throw new OperationNotSupportedException() 
    } 
} 

class Dependent { 

    Dependency dependency 

    void useDependency() { 
     dependency.with { method() } 
    } 
} 

講究方式方法如何()被調用的依賴 - 它完成內部「與」依賴的方法。

我需要模擬調用的測試方法(),所以我第一次嘗試做這樣的事情:

class IgnoringWithTest { 

    @Test 
    void testWithMock() { 
     def depMock = new MockFor(Dependency) 
     Dependent dep = new Dependent() 
     depMock.demand.method { } 
     dep.dependency = depMock.proxyInstance() 

     dep.useDependency() 

     depMock.verify dep.dependency 
    } 
} 

不幸的是這種「幼稚」的做法導致測試執行「不調用過程中的錯誤信息'with'預計到目前爲止,仍然有1個調用需要'method'。「這很好,因爲我們真的試圖在依賴關係上使用()方法調用。

我試圖忽視加入下一行調用與()方法:

depMock.ignore('with') 

這個我沒收到後抱怨有()但方法調用原來使用的需求是期望聲明忽略。結果我得到了OperationNotSupportedException。

現在是一個問題 - 如何在執行時不會出現問題的情況下爲方法()創建模擬方法,它將在傳遞給()的閉包中調用?

回答

0

我覺得這是一個MockFor錯誤,但有一個簡單的解決方案:一個depMock.use塊內封閉使用模擬的,像這樣:

import groovy.util.GroovyTestCase 
import groovy.mock.interceptor.MockFor 

class IgnoringWithTest extends GroovyTestCase { 

    void testWithMock() { 
     def depMock = new MockFor(Dependency) 
     Dependent dep = new Dependent() 
     depMock.ignore('with') 
     depMock.demand.method { } 
     dep.dependency = depMock.proxyInstance() 

     depMock.use { 
      dep.useDependency() 
     } 
    } 
} 
+0

謝謝。我不知道爲什麼,但在這種情況下使用'使用'塊。我會假設這也是一些Groovy錯誤。 – 2010-10-10 16:50:36

相關問題