开发者

Groovy mock Java class with parameters

I'm trying to use groovy's MockFor and proxyDelegateInstance to mock a java class with constructor parameters, but I can't seem to get it right. My Java class looks like:

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

class MyGroovyTest {
    @Test
    void t开发者_开发知识库estMyJavaClass() {
        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)
    }

}

Can I actually do this in groovy? And if so, how can I do it?

thanks, Jeff


The problem was that the class being mocked was a class and not an interface. In order to use the proxyDelegateInstance method, the an interface type needs to be used (or a groovy class). The proxy class is not actually of the MyJavaClass type but is a proxy and groovy's duck typing can handle that while Java cannot.


I can't tell you why your code above is not working, but there are several ways in Groovy to mock Java classes without using MockFor. For example, if you want to intercept all calls to the object, you can implement invokeMethod on the classes' metaClass, e.g.

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
}

Alternatively, if you simply want to provide an object that supports the method signatures of SomeJavaClass, you could use either a Map or an Expando with properties where:

  • property names match method names
  • proprerty values are closures that accept the same parameters as methods

If you can provide a bit more information about how the mock object is used, perhaps I can provide some more specific suggestions.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜