2009-06-10 16 views
0

我也有類似的一個Groovy類Groovy:在存根類型引用

class MyClass { 

    Foo foo 
} 

在某些情況下我不想初始化foo和想踩滅了所有給它的調用。任何返回值的方法都不應該做任何事情。我能做到這一點是這樣的:

Foo.metaClass.method1 = {param -> } 
Foo.metaClass.method2 = { -> } 
Foo.metaClass.method3 = {param1, param2 -> } 

雖然這工作,它有幾個問題

  1. 繁瑣和冗長的,特別是如果美孚有很多方法
  2. 這將踩滅調用美孚(不只是富)的任何實例

雖然Groovy提供一個StubFor類,如果我這樣做:

this.foo = new groovy.mock.interceptor.StubFor(Foo) 

我在運行時得到一個ClassCastException。雖然如果我能重新定義富,因爲這會工作:

def foo 

但對於原因,我不會進入這裏,我不能這樣做。

謝謝, 唐

回答

0

你需要的美孚實例傳遞給你的MyClass的對象。在測試中,傳入存根實現。在真正的程序中通過一個真正的實現。

您不需要任何特殊框架來編寫存根。如果您只查詢Foo的查詢,並且對期待命令不感興趣,那麼手動編寫存根實現會更容易。一個模擬對象庫是過分的,並會混淆後期讀者的代碼誰會期望測試包括期望。

0

我猜這只是爲了測試目的。

Foo foo 

創建一個getter/setter方法對,所以你可以注入你的測試案例模擬做:

新MyClass的()富=新MockFoo()

如果您不想爲自己創建模擬,請嘗試使用模擬庫,我推薦使用mockito。有了這個小庫,你可以做這樣的事情:

import static org.mockito.Mockito.*; 
new MyClass().foo = mock(Foo.class); 
0

我找到了解決辦法:

this.foo = {Object[] args -> println "I don't do anything"} as Foo 
0

你可以做一個地圖存根爲好,從而能夠存根多種方法,如所以:

def stubbedList = [empty : { false }, get: {index -> "always return this"}] as ArrayList 

如果你存根出一個類(如上面的例子ArrayList中),那麼你不重寫方法,因爲它們在類中實現保持。您也可以明顯地截取接口。

如果您需要模擬功能(即驗證測試中的行爲,如計算給定方法的調用次數),我強烈建議您檢查Spock test framework。它對更先進的存根和嘲諷提供了非常好的支持。