【问题标题】:How to mock a java.util.Map in groovy using map coercion?如何使用映射强制在 groovy 中模拟 java.util.Map?
【发布时间】:2012-03-05 23:28:24
【问题描述】:

我正在尝试使用 groovy map coercion 来模拟 Map。 我尝试了以下代码的各种变体,但结果始终为空。

Map<String, String> map = [get: {String  k -> "echo"}] as Map<String, String>

println map.get("a")

如果我使用map = {"echo"} as Map&lt;String, String&gt;,它可以工作。

关于如何使第一个版本工作的任何想法?

谢谢

【问题讨论】:

    标签: groovy mocking coercion


    【解决方案1】:

    像这样进行直接强制转换的问题在于,重新定义 getMap 已经是 Map 并且在 Groovy source 强制转换中有一个检查,说明如果你想要做的是将Map 之类的东西强制转换为Map,然后正常转换它,而不是根据需要尝试为接口创建代理。

    要解决这个问题,您可以将模拟对象设置为与 Map 不同的类型,例如 Expando,然后它将强制转换为您的接口类型:

    Map<String, String> map = new Expando([get: {String  k -> "echo"}]) as Map<String, String>
    assert map.get('a') == 'echo'
    

    【讨论】:

    • 好的,所以上面的代码可以工作,但不是出于我认为应该的最初原因。 MapMap 一样,因为我所说的原因不起作用,但我必须弄清楚是什么机制允许上述代码工作。
    • 还没有找到相关的源路径,但是有一篇关于使用 Expando 进行模拟的文章可能会被证明有用:docs.codehaus.org/display/GROOVY/…
    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 2015-04-11
    • 2016-04-06
    • 2010-10-10
    • 2011-03-13
    • 1970-01-01
    • 2010-12-25
    • 2020-02-21
    相关资源
    最近更新 更多