4

我使用 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);
    }
}

有没有更好的方法?

4

2 回答 2

1

自己使用 EasyMock 3.0 解决这个问题。然而,从 EasyMock 3.2 开始,它似乎已经通过重命名所有采用包装原语的方法并只留下一个剩余的捕获方法来解决。

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

于 2013-11-14T16:24:48.233 回答
0

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

于 2012-06-11T12:54:15.860 回答