我使用 Groovy、JUnit 和 EasyMock 为我的 Java 应用程序编写单元测试。在 EasyMock 中,有几个重载方法capture()
已被弃用,并附有注释“由于更严格的擦除强制,在 Java 7 中无法编译”。这些方法将类型的对象作为参数Capture<T>
。除其他外,存在以下方法:
static boolean capture(Capture<Boolean> captured)
static boolean capture(Capture<Integer> captured)
- ...
static <T> T capture(Capture<T> captured)
这在 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);
}
}
有没有更好的方法?