使用Groovy进行Java泛型和重载

我使用Groovy,JUnit和EasyMock为我的Java应用程序编写单元测试.
在EasyMock中有几个重载方法capture()已被弃用,注意“因为更难删除强制执行,不能在Java 7中编译”.该方法将Capture< T>类型的对象作为参数.除其他外,存在以下方法:

>静态布尔捕获(Capture< Boolean>捕获)
>静态布尔捕获(捕获<整数>捕获)
> ……
>静态< T> T捕获(捕获< T>捕获)

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

Capture<MyClass> myClassCapture = new Capture<MyClass>();
mockObject.someMethod(capture(myClassCapture));

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

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

谁能准确解释这里发生了什么?这将更好地理解Java和Groovy之间的不同行为.

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

public class EasyMockUtils {

    public static <T> T captureObject(Capture<T> 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进行Java泛型和重载 - 代码日志