Amazon web services 如何模拟S3客户端,以便在Golang测试中运行GetObject()?

Amazon web services 如何模拟S3客户端,以便在Golang测试中运行GetObject()?,amazon-web-services,unit-testing,go,amazon-s3,dependency-injection,Amazon Web Services,Unit Testing,Go,Amazon S3,Dependency Injection,我有一个接受路径和S3客户端的函数: ListObjects(文件夹,s3Client) 我希望它在生产中接受一个“真正的”客户。例如:s3.New(session.New() 但当我运行测试时,我更希望它接受我的模拟版本,这样我们就不会在测试中与AWS对话。 我实现这一点的方法是制作一个既匹配真实S3Client又匹配模拟版本的接口 这是最好的方法还是我遗漏了什么 首先,我定义了我计划模拟的函数的接口 package core import "github.com/aws/

我有一个接受路径和S3客户端的函数:
ListObjects(文件夹,s3Client)
我希望它在生产中接受一个“真正的”客户。例如:
s3.New(session.New()
但当我运行测试时,我更希望它接受我的模拟版本,这样我们就不会在测试中与AWS对话。 我实现这一点的方法是制作一个既匹配真实S3Client又匹配模拟版本的接口

这是最好的方法还是我遗漏了什么

首先,我定义了我计划模拟的函数的接口

  package core

  import "github.com/aws/aws-sdk-go/service/s3"

  type MyS3ClientInterface interface {
         ListObjects(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error)
  }
GetObjectsFromS3的实现方式如下:

// GetObjectsFromS3 returns a list of objects found in provided path on S3
func GetObjectsFromS3(path string, s3Client core.MyS3ClientInterface) ([]*core.Asset, error) {
      // build input variable
      result, err := s3Client.ListObjects(input)
      // cut..
}
这是我的模拟版s3Client.ListObjects

  package test_awstools

  import (
          "github.com/aws/aws-sdk-go/service/s3"
  )

  type MyS3Client struct{}

  func (m MyS3Client) ListObjects(input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) {
          output := &s3.ListObjectsOutput{}
          return output, nil
  }

  func (m MyS3Client) GetObject(input *s3.GetObjectInput) (*s3.GetObjectOutput, error) {
          // output := &s3.GetObject()
          return nil, nil
  }
内部/AWSTOOL/bucket_测试。开始

  1 package awstools
  2
  3 import (
  4         "fmt"
  5         "testing"
  6
  7         "internal/test_awstools"
  8 )
  9
 10 func TestListObjects(t *testing.T) {
 11         folder := "docs"
            // Use my mocked version of the S3 client.
 12         s3Client := &test_awstools.MyS3Client{}
            // And I pass that along to the ListObject function
 13         objects, err := ListObjects(folder, s3Client)
 14         if err != nil {
 15                 t.Error(err)
 16         }
 17         fmt.Println(objects)
 18 }

有一个很受欢迎的go项目,名为,它也实现了自己的。我建议您看看。在go中使用接口进行模拟是一种常见的好做法。有一点建议是不要返回由aws-s3包绑定的结果。如果您要创建一个真正的通用s3客户端接口,这是没有意义的。但是,如果您只想在单元测试时模拟它,这样做很好。