带参数的Groovy模拟Java类

时间:2010-02-09 15:39:11

标签: java groovy mocking

我正在尝试使用groovy的MockFor和proxyDelegateInstance来模拟带有构造函数参数的java类,但我似乎无法做到正确。我的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中实际做到这一点吗?如果是这样,我该怎么做?

感谢, 杰夫

2 个答案:

答案 0 :(得分:5)

问题在于被模拟的类是一个类,而不是一个接口。为了使用proxyDelegateInstance方法,需要使用接口类型(或groovy类)。代理类实际上不是MyJavaClass类型,但它是一个代理,并且groovy的duck typing可以处理,而Java则不能。

答案 1 :(得分:4)

我无法告诉你为什么上面的代码不起作用,但Groovy有几种方法可以在不使用MockFor的情况下模拟Java类。例如,如果要拦截对该对象的所有调用,可以在类的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,其中包含以下属性:

  • 属性名称与方法名称匹配
  • proprerty值是接受与方法相同的参数的闭包

如果您可以提供有关如何使用模拟对象的更多信息,也许我可以提供一些更具体的建议。