【问题标题】:Groovy and the MetaclassGroovy 和元类
【发布时间】: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


【解决方案1】:

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

HTTP.getMetaClass().static.jsonRestCallWithHeaders =  { String url, Map<String, ?> headers ->
    // ...
}

【讨论】:

  • 我不是 100% 确定,但乍一看,我认为这可能是我们应该修复的错误。如果您愿意,请通过 jira.codehaus.org/browse/GROOVY 提交 JIRA。
  • 对我来说它也有效。但是当使用metaClass 而不是getMetaClass() 时它会失败。为什么?
  • @Opal 看到我在你上面的评论。
  • 我看到了。只是没有意识到这是你想到的错误。谢谢!
猜你喜欢
  • 2015-01-18
  • 2010-10-21
  • 2012-07-29
  • 2015-09-03
  • 2011-07-07
  • 1970-01-01
  • 2012-05-16
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多