【问题标题】:How to mock a single method for a class in Spock?如何在 Spock 中模拟一个类的单个方法?
【发布时间】:2017-12-29 00:43:37
【问题描述】:

我的班级中有一个类似下面的方法,我正在尝试测试:

class SomeHelper { 
    ByteArrayOutputStream fooBar (Request request) {
       ByteArrayOutputStream baos = someParser.parseData(getRequestFileInputStream(request.filename))
       return baos
    }
    InputStream getRequestFileInputStream(String filename) {
      //return intputStream of object from S3
    }
....
}

在上面,getRequestFileInputStream 是一个将文件名作为参数的方法。它从 AWS S3 获取该文件的输入流。在从 Spock 测试 fooBar 方法时,我想为 getRequestFileInputStream 方法提供一个模拟,因为我不想使用类中的此方法的实现,因为它转到另一个存储桶名称。

可以这样做吗?

以下是我尝试过的:

class SomeHelperSpec extends Specification{
    //this is the implementation of getRequestFileInputStream I want to use while testing
    InputStream getObjectFromS3(String objectName) {
            def env = System.getenv()
            AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration(env["endpoint_url"], env["region_name"])
            AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard()
            builder.setEndpointConfiguration(endpoint)
            builder.setCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(env["ACCESS_KEY"], env["SECRET_KEY"])))
            AmazonS3 s3 = builder.build()
            return s3.getObject("testbucket", objectName).getObjectContent()

    }

    def "test fooBar" () {
      given: 
         someHelper = new SomeHelper()
         someHelper.getRequestFileInputStream(_) >> getObjectFromS3(fileName)
         someHelper.someParser = Mock(SomeParser) {
           ....
         }
         Request requestInstance = new Request()
         request.filename = fileName
         request.fileType = fileType
      expect:
         someHelper.fooBar(requestInstance).getText == returnVal

      where:
         fileType | fileName      | returnVal    
         "PDF"    | "somepdf.pdf" | "somereturnval"
    }
}

但是,上述方法不起作用,因为它仍在尝试在 SomeHelper 中调用 getRequestFileInputStream 的原始实现,而不是使用规范中提供的模拟实现。

【问题讨论】:

    标签: groovy spock


    【解决方案1】:

    您可以使用真实的对象,但可以使用重写的方法:

    given:
        someHelper = new SomeHelper() {
             @Override
             InputStream getRequestFileInputStream(String filename) {
                 return getObjectFromS3(fileName)
             }
        }
    

    【讨论】:

      【解决方案2】:

      你可以使用间谍

      def someHelper = Spy(SomeHelper)
      someHelper.getRequestFileInputStream(_) >> getObjectFromS3(fileName)
      

      Spies

      【讨论】:

        猜你喜欢
        • 2020-05-23
        • 2015-02-11
        • 2012-08-04
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多