如何测试需要使用token调用数据服务的handler
自研API Handler测试方案
针对你这段获取token的handler逻辑,核心测试思路是通过依赖注入隔离外部依赖,用mock返回预设值覆盖所有代码分支,不需要真实调用认证服务或者AWS X-Ray等外部组件,具体测试方案如下:
测试场景覆盖
你需要覆盖3个核心分支:
- getM2MToken返回错误的场景
验证该分支下handler会返回状态码500,响应体为Internal Server Error (m2m) - getM2MToken正常返回、getBearer返回错误的场景
验证该分支下handler会返回状态码500,响应体为Internal Server Error (bearer),同时X-Ray会正确记录错误信息 - 两个token都正常获取的场景
验证handler拿到token后能正常进入后续业务逻辑
测试实现参考(Go语言)
推荐用testify/mock库实现依赖mock,步骤如下:
- 先把handler的token获取方法抽象为接口,方便替换mock实现
type TokenProvider interface { getM2MToken(ctx context.Context) (string, error) getBearer(headers map[string]string) (string, error) }
- 实现mock类满足上述接口
import "github.com/stretchr/testify/mock" type MockTokenProvider struct { mock.Mock } func (m *MockTokenProvider) getM2MToken(ctx context.Context) (string, error) { args := m.Called(ctx) return args.String(0), args.Error(1) } func (m *MockTokenProvider) getBearer(headers map[string]string) (string, error) { args := m.Called(headers) return args.String(0), args.Error(1) }
- 编写测试用例示例(测试getM2MToken报错分支)
import ( "context" "errors" "net/http" "testing" "github.com/aws/aws-lambda-go/events" "github.com/stretchr/testify/assert" ) func TestHandler_M2MTokenError(t *testing.T) { // 初始化mock,设置getM2MToken调用时返回错误 mockToken := new(MockTokenProvider) testErr := errors.New("m2m fetch failed") mockToken.On("getM2MToken", mock.Anything).Return("", testErr) // 注入mock到handler实例 h := &YourHandlerStruct{ tokenProvider: mockToken, } // 构造测试请求和Lambda上下文 ctx := context.Background() testReq := events.APIGatewayV2HTTPRequest{Headers: map[string]string{}} mockLC := &MockLambdaContext{} // 自行实现mock的Lambda上下文,捕获SetResponse的返回值 // 执行handler逻辑 _ = h.HandleRequest(ctx, testReq, mockLC) // 断言结果符合预期 mockToken.AssertExpectations(t) assert.Equal(t, http.StatusInternalServerError, mockLC.Resp.StatusCode) assert.Equal(t, "Internal Server Error (m2m)", *mockLC.Resp.Body) }
注意事项
- 所有外部依赖(包括X-Ray、Lambda上下文、Token获取逻辑)都要通过接口注入到handler,不要在handler内部硬编码实例化,否则无法做单元测试
- 其他测试分支的用例可以参考上述示例修改mock的返回值,再调整断言逻辑即可
- 测试不需要真实部署环境,本地即可完成所有分支的覆盖验证
内容的提问来源于stack exchange,提问作者Shaheem Naseeb
相关产品推荐
相关产品推荐

