Grails嘲笑失败了

时间:2015-04-07 04:41:43

标签: grails integration-testing spock

我已经编写了一项服务,正在进行集成测试。该服务在内部调用外部休息服务并填充该值。

服务类

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

无需事先定义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