如何在aws-sdk-go-v2 v1.17.15中Mock ACM PCA接口用于单元测试
Mock ACM PCA API in aws-sdk-go-v2 v1.17.15 (No acmpcaiface)
aws-sdk-go-v2 不再提供 v1 风格的 *iface 接口,你需要通过自定义抽象接口的方式实现 Mock,具体步骤如下:
1. 定义匹配业务需求的自定义接口
根据你用到的 IssueCertificate() 和 GetCertificate() 方法,定义一个包含对应签名的接口,方法签名要和 ACM PCA 客户端的方法完全一致:
import ( "context" "github.com/aws/aws-sdk-go-v2/service/acmpca" ) // ACMPCAClient 自定义接口,包含业务需要的方法 type ACMPCAClient interface { IssueCertificate(ctx context.Context, params *acmpca.IssueCertificateInput, optFns ...func(*acmpca.Options)) (*acmpca.IssueCertificateOutput, error) GetCertificate(ctx context.Context, params *acmpca.GetCertificateInput, optFns ...func(*acmpca.Options)) (*acmpca.GetCertificateOutput, error) }
2. 修改业务代码依赖自定义接口
将业务代码中直接依赖 *acmpca.Client 的地方,替换为依赖上面定义的 ACMPCAClient 接口:
// 示例业务服务 type CertificateService struct { pcaClient ACMPCAClient } func NewCertificateService(client ACMPCAClient) *CertificateService { return &CertificateService{pcaClient: client} } // 业务方法中调用接口方法 func (s *CertificateService) IssueCert(ctx context.Context, input *acmpca.IssueCertificateInput) (*acmpca.IssueCertificateOutput, error) { return s.pcaClient.IssueCertificate(ctx, input) }
3. 编写Mock客户端实现
创建一个Mock结构体,实现 ACMPCAClient 接口,在方法中返回你预设的测试数据或错误:
import "fmt" // MockACMPCAClient 用于单元测试的Mock客户端 type MockACMPCAClient struct { IssueCertFunc func(ctx context.Context, params *acmpca.IssueCertificateInput, optFns ...func(*acmpca.Options)) (*acmpca.IssueCertificateOutput, error) GetCertFunc func(ctx context.Context, params *acmpca.GetCertificateInput, optFns ...func(*acmpca.Options)) (*acmpca.GetCertificateOutput, error) } // 实现IssueCertificate方法 func (m *MockACMPCAClient) IssueCertificate(ctx context.Context, params *acmpca.IssueCertificateInput, optFns ...func(*acmpca.Options)) (*acmpca.IssueCertificateOutput, error) { if m.IssueCertFunc != nil { return m.IssueCertFunc(ctx, params, optFns...) } return nil, fmt.Errorf("mock not implemented") } // 实现GetCertificate方法 func (m *MockACMPCAClient) GetCertificate(ctx context.Context, params *acmpca.GetCertificateInput, optFns ...func(*acmpca.Options)) (*acmpca.GetCertificateOutput, error) { if m.GetCertFunc != nil { return m.GetCertFunc(ctx, params, optFns...) } return nil, fmt.Errorf("mock not implemented") }
4. 在单元测试中使用Mock
测试时,实例化Mock客户端,并为需要测试的方法设置自定义逻辑:
import ( "context" "testing" "github.com/aws/aws-sdk-go-v2/service/acmpca" "github.com/stretchr/testify/assert" ) func TestIssueCertificate(t *testing.T) { // 初始化Mock客户端 mockClient := &MockACMPCAClient{ IssueCertFunc: func(ctx context.Context, params *acmpca.IssueCertificateInput, optFns ...func(*acmpca.Options)) (*acmpca.IssueCertificateOutput, error) { // 预设测试响应 certArn := "arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/12345678-1234-1234-1234-123456789012/certificate/abcdefgh-1234-5678-90ab-cdefghijklmn" return &acmpca.IssueCertificateOutput{ CertificateArn: &certArn, }, nil }, } // 初始化业务服务,传入Mock客户端 service := NewCertificateService(mockClient) // 执行测试 input := &acmpca.IssueCertificateInput{/* 填入测试用输入参数 */} resp, err := service.IssueCert(context.Background(), input) // 断言结果 assert.NoError(t, err) assert.Equal(t, "arn:aws:acm-pca:us-east-1:123456789012:certificate-authority/12345678-1234-1234-1234-123456789012/certificate/abcdefgh-1234-5678-90ab-cdefghijklmn", *resp.CertificateArn) }
通过这种方式,就能完全Mock ACM PCA的两个目标方法,完成单元测试。
内容的提问来源于stack exchange,提问作者ravi_ns
相关产品推荐
相关产品推荐

