groovy - Spock - 模拟外部服务

标签 groovy mocking spock grails-services grails-test

我是 spock 框架测试的新手,我没有找到任何可以找到所需信息的示例。因此,我认为最好的方法是展示我需要的示例。

  1. 例如spock 中的测试类:

    def "getData" (){ // this is test of getData method from ExternalService
      when:
        Result result = externalService.getData()
      then:
        result.msg = 'SUCCESS'
    }
    
  2. 服务等级:

    public class ExternalService(){
      private ServiceConnector serviceConnector;
    
      public Result getData(){
        Result result = serviceConnector.callAndGet(); 
        prepareInformation(data);
        updateStatuses(data);
        return result;
      }
    }
    
  3. 将数据分类为域类:

    public class Data {
      private String msg
      private int Id
      // +getters/setters
    }
    

现在我有 getData 测试并且想模拟唯一的方法 callAndGet()。这意味着每次我调用 callAndGet 时,我都需要有带有 msg SUCCESS 的对象数据,但是应该正常调用 getData 方法中的所有其他方法。

是不是很明白?问题是我们如何将服务类 ExternalService 注入(inject)/模拟到 spock 测试类中?

最佳答案

您需要做的是模拟 ServiceConnector 类并通过构造函数(例如)传递它。见下文:

@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
@Grab('cglib:cglib-nodep:3.1')


import spock.lang.*

class Test extends Specification {
    def 'some spec'() {
        given:    
            def serviceConnector = Mock(ServiceConnector) {
                callAndGet() >> new Result(msg: 'SUCCESS')
            }
            def externalService = new ExternalService(serviceConnector)

        when:
            Result result = externalService.getData()

        then:
            result.msg == 'SUCCESS'
    }
}

public class ExternalService {
  private ServiceConnector serviceConnector

  public ExternalService(ServiceConnector serviceConnector) {
      this.serviceConnector = serviceConnector
  }

  public Result getData() {
    Result result = serviceConnector.callAndGet()

    prepareInformation(result)
    updateStatuses(result)
    result
  }

  private void prepareInformation(Result data) {
  }

  private void updateStatuses(Result data) {
  }
}

public class ServiceConnector {
    public Result callAndGet() {

    }    
}

public class Result {
    String msg
}

关于groovy - Spock - 模拟外部服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36279993/

相关文章:

grails - Multi-Tenancy 时如何使用DomainUnitTest进行测试

android - 如何在不同的Android构建版本之间共享依赖项?

grails - 将父元素从 MarkupBuilder 传递给方法

groovy - 如何使用groovy在soapui中创建日期时间字符串

scala - 在单元测试中模拟 Spark RDD

python - 如何模拟List类型的全局变量?

c# - 根据对象的属性而不是其引用模拟设置返回类型

jenkins - 使用 Spock 的 Groovy 共享库测试流水线步骤方法

groovy - Groovy 脚本中的全局方法

java - 如何在 Eclipse 中查看 Spock 测试的代码覆盖率