Grails 模拟失败

Grails mocking is failing

我编写了一个正在执行集成测试的服务。该服务在内部调用外部休息服务并填充值。

服务class

import org.springframework.web.client.RestTemplate;

class Service {
    final static RestTemplate TEMPLATE = new RestTemplate()

    def getList() {
        final String info = TEMPLATE.getForObject(getHostUrl(), String.class,[:])
        return info
    }

为了避免实际的外部服务调用,我尝试如下模拟它。

class ServiceIntegrationSpec extends IntegrationSpec {

    void testList() {
        setup:
            List<Employee> list = new ArrayList<>()
            list.add(new Employee(id:"123", name: "test1"))
            list.add(new Employee(id:"146", name: "test2"))
            def clazz = String.class
            def url  = ""
            def emptyMap = [:]
            rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
            Map emptyMap ->list}

        when:
            def val = service.getList()

        then:
            val != null
    }
}

当集成测试 运行 使用命令:grails test-app integration:,我得到以下错误:

  1. 当前范围已经包含一个变量url
  2. 当前作用域已经包含一个变量clazz
  3. 当前作用域已经包含变量emptyMap

您尝试重命名元类方法的变量

rackService.TEMPLATE.metaClass.getForObject = {String urlParameter, Class clazzParameter,
        Map emptyMap ->listParameter}

不需要预先定义url、clazz和emptyMap。 代码

        def clazz = String.class
        def url  = ""
        def emptyMap = [:]
        rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
        Map emptyMap ->list}

可以替换为

        rackService.TEMPLATE.metaClass.getForObject = {String url, Class clazz,
        LinkedHashMap emptyMap ->list}

请注意,groovy 默认将此空映射 [:] 视为 LinkedHashMap。请在下面找到参考资料:
http://www.javaworld.com/article/2073116/java-collections-default-implementation-choices--groovy-s-opinion.html