2010-02-09 25 views
4

我想使用groovy的MockFor和proxyDelegateInstance模擬一個具有構造函數參數的java類,但我似乎無法弄清楚它的正確性。我的Java類看起來像:Groovy模擬Java參數的類

class MyJavaClass { 
    private MyObject myObj 
    public MyJavaClass(MyObject myObj) { 
     this.myObj = myObj; 
    } 
} 

class MyGroovyTest { 
    @Test 
    void testMyJavaClass() { 
     def mock = new MockFor(MyJavaClass) 
     MyJavaClass mjc = new MyJavaClass() 
     def mockProxy = mock.proxyDelegateInstance([mjc] as Object[]) 
     // if I pass mockProxy to anything, I get an error that a matching 
     // constructor could not be found. I've tried variations on the args 
     // to proxyDelegateInstance (such as using mjc as a single arg rather than 
     // an array of one element) 
    } 

} 

我可以在groovy中做到這一點嗎?如果是這樣,我該怎麼做?

感謝, 傑夫

回答

5

問題是被模擬的類是一個類而不是接口。爲了使用proxyDelegateInstance方法,需要使用一個接口類型(或一個常規類)。代理類實際上並不是MyJavaClass類型,但是它是一個代理,Groovy的鴨子類型可以處理,而Java不能。

+0

您最終使用的是什麼? – user944849 2016-09-28 16:43:52

4

我不能告訴你爲什麼你上面的代碼不工作,但也有在Groovy幾種方式來嘲笑Java類,而無需使用MockFor。例如,如果要攔截對該對象的所有調用,則可以在類的metaClass上實現invokeMethod,例如,

class SomeJavaClass { 
    // methods not shown 
} 

def instance = new SomeJavaClass() 

instance.metaClass.invokeMethod = {String name, args -> 
    // this will be called for all methods invoked on instance 
} 

或者,如果你只是想提供支持的SomeJavaClass方法簽名的對象,你可以使用一個MapExpando與性質其中:

  • 屬性名稱匹配方法名
  • 特許值是接受與方法相同的參數的閉包

如果您可以提供更多有關如何使用模擬對象的信息,也許我可以提供一些更具體的建議。

+0

不,問題是如果我有另一個類,我們稱之爲Actor,它將MyJavaClass作爲參數,我調用actor.doSomething(mockProxy)我得到一個關於沒有合適的構造函數來創建MyJavaClass的錯誤。 – 2010-02-09 18:30:08

+0

如果Actor沒有真正實例化MyJavaClass,那麼您能否正常實例化MyJavaClass,並使用invokeMethod來覆蓋方法實現? – 2010-02-09 19:14:46

+0

在測試結束時,我需要驗證MyJavaClass,這就是爲什麼我將它創建爲模擬的原因。 – 2010-02-09 19:26:04