使用Groovy进行Javagenerics和重载

我使用Groovy,JUnit和EasyMock为我的Java应用程序编写unit testing。 在EasyMock中有几个重载方法capture()已被弃用,注意“由于更难的擦除强制执行,不能在Java 7中编译”。 这些方法将Capture类型的对象作为参数。 除其他外,存在以下方法:

  • static boolean capture(Capture captured)
  • static boolean capture(Capture captured)
  • static T capture(Capture captured)

在Java中不再允许这样做,但是如果直接从Java调用该代码,则会调用正确的方法。 例如,当您执行此代码时

 Capture myClassCapture = new Capture(); mockObject.someMethod(capture(myClassCapture)); 

调用正确的方法(列表中的最后一个)。

另一方面,如果从Groovy内部调用相同的代码,则会调用列表中的第一个方法,并在测试中出错。 我认为这与Java和Groovy如何解决这些方法有关。 我的假设是Java在编译时绑定方法,而Groovy试图在运行时找到该方法并采用它可以找到的任何方法(可能是第一个)。

任何人都能解释到底发生了什么吗? 这样可以更精确地理解Java和Groovy之间的不同行为。

我通过将Groovy中的调用委托给Java方法来修复它,它将为我完成这项工作:

 public class EasyMockUtils { public static  T captureObject(Capture captureForObject) { return EasyMock.capture(captureForObject); } } 

可能有更好的方法吗?

我只是使用EasyMock 3.0来解决这个问题。 然而,从EasyMock 3.2开始,通过重命名包含原始图形的所有方法并仅留下一个剩余的捕获方法,它看起来已被解决。

查看3.2文档了解更多信息: http : //easymock.org/api/easymock/3.2/org/easymock/EasyMock.html#capture%28org.easymock.Capture%29

尝试使用Groovy 2.0的@CompileStatic – 可能会解决您的问题