【发布时间】:2014-11-28 22:26:50
【问题描述】:
我正在尝试使用元类来覆盖测试中的静态方法。
方法是:
org.boon.HTTP.jsonRestCallWithHeaders
它是一个 Java 类,它超出了我的控制范围。
声明是:
public static Response jsonRestCallWithHeaders(
final String url,
final Map<String, ?> headers
)
我正在尝试通过以下方式用闭包覆盖该方法:
HTTP.metaClass.static.jsonRestCallWithHeaders = { String url, Map<String, ?> headers ->
if (url.path?.contains('/quotes')) {
[prop1:value1,
prop2: value2 ] as JSON }
但是,当它遇到该重定向请求时,它不会尝试重写该方法。它初始化 HTTP 类,并尝试调用 HTTP.get 函数。
我的问题是:为什么jsonRestCallWithHeaders方法的这个定义调用了HTTP::get静态方法?
堆栈跟踪的图片:
我使用的是 Groovy 2.1.9,Grails:2.3.8。代码正在测试环境中运行。
【问题讨论】:
-
您的描述中有几件事对我来说没有任何意义,所以我无法回答您的问题,但您将 Groovy 2.3.6 与 Grails 2.3 一起使用是很奇怪的。 8.我们将 Grails 2.3.8 与 Groovy 2.1.9 一起发布,这是 Grails 2.3.8 支持的唯一 Groovy 版本。您是否构建了自己的版本或进行了其他操作来替换 Grails 副本中的 Groovy 版本?
-
我会将其更改为 Groovy 2.1.9,因为它们已捆绑在一起。
-
您是否以某种方式将 Groovy 2.3.6 与 Grails 2.3.8 一起使用?
-
自从我配置了 Grails 2.3.8 后,我不认为我是这样的。 Groovy 2.3.6 是通过 GVM 作为唯一的 Groovy 实现安装的,所以我假设它们是分开的。
-
对。那是有道理的。
标签: reflection groovy mocking metaclass