You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:20:24