Reflection Groovy与元类

Reflection Groovy与元类,reflection,groovy,mocking,metaclass,Reflection,Groovy,Mocking,Metaclass,我试图在测试中使用元类覆盖静态方法 方法是: org.boon.HTTP.jsonRestCallWithHeaders 这是一个Java类,我无法控制它 宣言是: public static Response jsonRestCallWithHeaders( final String url, final Map<String, ?> headers ) public静态响应jsonRestCallWithHeaders

我试图在测试中使用元类覆盖静态方法

方法是:

org.boon.HTTP.jsonRestCallWithHeaders 
这是一个Java类,我无法控制它

宣言是:

public static Response jsonRestCallWithHeaders(
            final String url,
            final Map<String, ?> headers
    )
public静态响应jsonRestCallWithHeaders(
最终字符串url,
最终地图标题
)
我正试图通过以下方式用闭包覆盖该方法:

HTTP.metaClass.static.jsonRestCallWithHeaders =  { String url, Map<String, ?> headers ->
            if (url.path?.contains('/quotes')) {
                [prop1:value1,
                        prop2: value2 ] as JSON }
HTTP.metaClass.static.jsonRestCallWithHeaders={字符串url,映射头->
if(url.path?.contains('/quotes')){
[prop1:value1,
prop2:value2]作为JSON}
但是,当它点击该重定向请求时,它不会尝试重写该方法。它初始化HTTP类,并尝试调用HTTP.get函数

我的问题是:为什么jsonRestCallWithHeaders方法的这个定义调用HTTP::get static方法

stacktrace的图片:


我使用的是Groovy 2.1.9,Grails:2.3.8。代码在测试环境中运行。

我已经测试了以下内容,并且可以正常工作:

HTTP.getMetaClass().static.jsonRestCallWithHeaders =  { String url, Map<String, ?> headers ->
    // ...
}
HTTP.getMetaClass().static.jsonRestCallWithHeaders={字符串url,映射头->
// ...
}

您的描述中有几点对我来说毫无意义,因此我无法尝试回答您的问题,但奇怪的是您将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实现,所以我认为它们是分开的。对。这是有道理的。我不是100%确定,但乍一看,我认为这可能是一个我们应该修复的错误。如果您愿意,请在上提交JIRA。对我来说,它也可以工作。但当使用
metaClass
而不是
getMetaClass()时,它会失败
。为什么?@Opal看到我的评论就在你的上面。我看到了。只是没有意识到这是你想到的错误。谢谢!