【问题标题】:Grails mocking is failingGrails 模拟失败
【发布时间】:2015-04-07 04:41:42
【问题描述】:

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

服务类

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

【问题讨论】:

    标签: grails integration-testing spock


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不需要预先定义 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 2016-06-27
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        相关资源
        最近更新 更多