使用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 – 可能会解决您的问题