使用groovy映射进行模拟时可能出现的错误;as<;someClass>&引用;当你在模拟地图时?

使用groovy映射进行模拟时可能出现的错误;as<;someClass>&引用;当你在模拟地图时?,groovy,mocking,Groovy,Mocking,我遇到了一件非常古怪的事情,我认为这是一个错误: 我喜欢在单元测试中使用带有闭包的映射来模拟类。最近,我尝试模拟一个实现了Map的Quartz类。我得到了非常奇怪的行为,我将其缩小为一个非常简单的单元测试,它只是试图模拟java.util.Map接口 下面是单元测试。如果运行它,您会注意到get()与我的java.util.Map接口(MyMap)的缩写版本相对应。但当我嘲笑地图时,它失败了。我不明白为什么。。在我提交bug之前,我想我应该问问我的groovy粉丝们。提前感谢您的输入-/chri

我遇到了一件非常古怪的事情,我认为这是一个错误:

我喜欢在单元测试中使用带有闭包的映射来模拟类。最近,我尝试模拟一个实现了Map的Quartz类。我得到了非常奇怪的行为,我将其缩小为一个非常简单的单元测试,它只是试图模拟java.util.Map接口

下面是单元测试。如果运行它,您会注意到get()与我的java.util.Map接口(MyMap)的缩写版本相对应。但当我嘲笑地图时,它失败了。我不明白为什么。。在我提交bug之前,我想我应该问问我的groovy粉丝们。提前感谢您的输入-/chris

package foo

import org.testng.annotations.Test
/*
 * Author: cbedford
 * Date: 3/26/14
 * Time: 4:36 PM
 */

public class GroovyMockTest {

    @Test(enabled = true)
    public void testMapFails() {
    Map map = [
        get: { Object key ->
            println "getting key: " + key
            return 300;
        }

    ] as Map

    assert map.get('dummy') == 300
    }

    @Test(enabled = true)
    public void testMyMapFWorks() {
    MyMap map = [
        get: { Object key ->
            println "getting key: " + key
            return 300;
        }

    ] as MyMap

    assert map.get('dummy') == 300
    }
}

public interface MyMap<K,V> {
    V get(Object key);
}
包foo
导入org.testng.annotations.Test
/*
*作者:cbedford
*日期:2014年3月26日
*时间:下午四时三十六分
*/
公共类GroovyMockTest{
@测试(启用=真)
公共void testMapFails(){
地图=[
获取:{对象键->
println“获取密钥:+密钥
返回300;
}
]作为地图
断言map.get('dummy')==300
}
@测试(启用=真)
public void testMyMapFWorks(){
我的地图=[
获取:{对象键->
println“获取密钥:+密钥
返回300;
}
]作为我的地图
断言map.get('dummy')==300
}
}
公共接口MyMap{
V get(对象键);
}

我怀疑这是一个bug。Groovy map在从映射获取属性时实现
getAt
/
getProperty
/
propertyMissing
,调用
map::get
不会触发它,因为该方法存在

如果您先获取密钥,然后将其用作闭包,则此功能将起作用:

assert map.get('get')('dummy') == 300
或:


这是一个很好的答案。当我回到这里时,我意识到人们通常使用映射来模拟其他类,映射给出了该类的方法。但是我在上面尝试做的。。。像个傻瓜。。。就是用地图来模拟地图。。但问题是模拟已经是一张地图了。。所以它的行为就像一张地图。。当我查找dummy时,它不在地图上。映射使用自己的get本机实现来执行“get”。如果这有道理的话。不管怎么说,我现在觉得这很有道理(但在凌晨2点我第一次被这个绊倒的时候没有)。
assert map['get']('dummy') == 300