如何为无返回错误的Golang ResponseJson函数编写错误分支测试?
测试无返回error的ResponseJson函数的序列化错误分支
要覆盖json.Marshal失败的分支,核心思路就是构造一个无法被JSON序列化的输入,再结合你已经实现的日志捕获函数验证错误行为,同时检查响应输出是否符合预期。
步骤1:构造不可序列化的测试对象
Go里可控的不可序列化场景,推荐用自定义实现json.Marshaler接口但返回错误的类型:
// 定义一个会序列化失败的类型 type badMarshaler struct{} func (b badMarshaler) MarshalJSON() ([]byte, error) { return nil, fmt.Errorf("模拟JSON序列化失败") }
步骤2:编写测试用例
在Test_ResponseJson里新增测试分支,用httptest.ResponseRecorder模拟响应Writer,结合你的GenerateLogOutput捕获日志,验证错误分支的行为:
func Test_ResponseJson(t *testing.T) { // 正常分支测试(你已实现的部分) t.Run("正常序列化", func(t *testing.T) { // ... 你的原有测试代码 }) // 新增序列化失败分支测试 t.Run("序列化失败", func(t *testing.T) { // 模拟HTTP响应Writer w := httptest.NewRecorder() // 使用不可序列化的测试对象 badData := badMarshaler{} // 捕获log输出 logOutput := GenerateLogOutput(func() { ResponseJson(w, badData) }) // 验证日志是否包含预期错误信息 if !strings.Contains(logOutput, "JSON序列化失败") { t.Errorf("期望日志包含序列化错误,实际输出:%s", logOutput) } // 验证响应状态码(根据你的函数设计调整,比如500) if w.Code != http.StatusInternalServerError { t.Errorf("期望状态码500,实际:%d", w.Code) } // 验证响应内容(如果你的函数出错时返回空或特定内容,按需调整) if w.Body.String() != "" { t.Errorf("期望响应为空,实际:%s", w.Body.String()) } }) }
关键说明
- 如果原函数在
json.Marshal失败时会返回特定响应内容(比如错误提示JSON),要对应调整响应内容的验证逻辑。 httptest.ResponseRecorder可以完整捕获函数对HTTP响应的所有操作,确保错误分支的响应行为符合设计。- 确保你的
GenerateLogOutput能匹配原函数使用的日志方法(比如原函数用log.Printf的话,捕获逻辑要对应调整)。
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

