Amazon web services 如何模拟S3客户端,以便在Golang测试中运行GetObject()?
我有一个接受路径和S3客户端的函数: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/
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客户端接口,这是没有意义的。但是,如果您只想在单元测试时模拟它,这样做很好。