我使用 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);
}
}
也许有更好的方法吗?
我自己使用 EasyMock 3.0 就遇到了这个问题。然而,从 EasyMock 3.2 开始,这个问题似乎已经得到解决,方法是重命名所有采用包装原语的方法,并只留下一个剩余的捕获方法。
检查 3.2 文档以获取更多信息:http://easymock.org/api/easymock/3.2/org/easymock/EasyMock.html#capture%28org.easymock.Capture%29
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)