如何使用映射强制在groovy中模拟java.util.Map?
我正在尝试使用groovy映射强制来模拟映射。 我尝试了下面代码的各种变体,但结果总是空的如何使用映射强制在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它会工作 关于
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
asMap
不起作用,但我必须弄清楚是什么机制允许上述代码起作用。我还没有找到相关的源代码路径,但有一篇关于使用Expando进行模拟的文章可能很有用: