如何使用映射强制在groovy中模拟java.util.Map?

如何使用映射强制在groovy中模拟java.util.Map?,groovy,mocking,coercion,Groovy,Mocking,Coercion,我正在尝试使用groovy映射强制来模拟映射。 我尝试了下面代码的各种变体,但结果总是空的 Map<String, String> map = [get: {String k -> "echo"}] as Map<String, String> println map.get("a") Map-Map=[get:{String k->“echo”}]作为映射 println map.get(“a”) 如果我使用map={“echo”}作为map它会工作 关于

我正在尝试使用groovy映射强制来模拟映射。 我尝试了下面代码的各种变体,但结果总是空的

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

println map.get("a")
Map-Map=[get:{String k->“echo”}]作为映射
println map.get(“a”)
如果我使用
map={“echo”}作为map
它会工作

关于如何使第一个版本工作有什么想法吗


谢谢

像这样直接强制的问题是,重新定义
get
Map
已经是一个
Map
了,强制中有一个复选框,表示如果你试图做的是将
Map
这样的东西强制到
Map
中,那么就正常地强制转换它,而不是尝试根据需要创建接口的代理

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

Map<String, String> map = new Expando([get: {String  k -> "echo"}]) as Map<String, String>
assert map.get('a') == 'echo'
Map Map=newexpando([get:{String k->“echo”}])作为映射
断言map.get('a')='echo'

好的,上面的代码可以工作,但不是出于我认为应该的原始原因。由于我所说的原因,
Map
as
Map
不起作用,但我必须弄清楚是什么机制允许上述代码起作用。我还没有找到相关的源代码路径,但有一篇关于使用Expando进行模拟的文章可能很有用: