使用groovy地图进行模拟的可能错误&#34; as <someclass>&#34;当你嘲笑地图?</someclass>

时间:2014-03-27 06:11:10

标签: groovy mocking

我遇到了一些非常糟糕的事情,我认为这是一个错误:

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

单元测试如下。如果你运行它,你会注意到我的缩写版本的java.util.Map接口的get()工作(MyMap)。但是当我模仿Map时,它就失败了。我无法弄清楚为什么......在我提交错误之前,我想我会问我的同伴们。提前感谢您的意见 - / 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);
}

1 个答案:

答案 0 :(得分:0)

我怀疑这是一个错误。 Groovy地图在从地图获取属性时实施getAt / getProperty / propertyMissing,并且调用Map::get不会触发它,因为该方法存在。

如果您首先获得密钥然后将其用作闭包,则它可以工作:

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

或者:

assert map['get']('dummy') == 300