質問

I am trying to mock Map using groovy map coercion. I have tried various variations of the code bellow but the result was always null.

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

println map.get("a")

If I use map = {"echo"} as Map<String, String> it works.

Any ideas on how to make the first version work?

thanks

役に立ちましたか?

解決

The problem with doing a straight coercion like that is that the Map that redefines get is already a Map and there's a check in the Groovy source coercion that says if what you're trying to do is coerce something like a Map into a Map then just cast it normally instead of trying to create proxy to the interface as you want.

To get around this you can make your mock object a different type than Map, like an Expando, then it'll coerce into your interface type:

Map<String, String> map = new Expando([get: {String  k -> "echo"}]) as Map<String, String>
assert map.get('a') == 'echo'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top