如何在单元测试中模拟json.NewDecoder.Decode的错误场景?
模拟
json.NewDecoder.Decode错误场景的单元测试方法 要模拟json.NewDecoder(r.Body).Decode(&infos)的错误,核心是构造无效的请求体,让JSON解码过程触发错误,具体步骤和示例如下:
核心思路
json.NewDecoder接收一个io.Reader作为输入(对应r.Body),只要让这个Reader返回不符合JSON语法规则的内容,Decode方法就会返回错误。我们可以通过构造错误的JSON字符串,再包装成http.Request的请求体来实现。
具体测试示例
假设你要测试的函数签名为HandleRegister(w http.ResponseWriter, r *http.Request),单元测试代码如下:
package yourpackage import ( "bytes" "net/http" "net/http/httptest" "testing" ) func TestHandleRegister_DecodeError(t *testing.T) { // 1. 构造无效JSON:比如语法错误(缺少闭合引号) invalidJSON := []byte(`{"username":"test, "password":"123456"}`) // 2. 创建模拟HTTP请求,将无效JSON作为请求体 req, err := http.NewRequest("POST", "/register", bytes.NewBuffer(invalidJSON)) if err != nil { t.Fatalf("创建请求失败:%v", err) } req.Header.Set("Content-Type", "application/json") // 3. 用httptest.ResponseRecorder捕获响应 recorder := httptest.NewRecorder() // 4. 调用待测试的处理函数 HandleRegister(recorder, req) // 5. 验证错误处理逻辑是否符合预期 if recorder.Code != http.StatusBadRequest { t.Errorf("期望状态码%d,实际得到%d", http.StatusBadRequest, recorder.Code) } }
其他可测试的错误场景
除了JSON语法错误,还可以构造以下场景触发Decode错误:
- 空请求体:用
bytes.NewBuffer([]byte(""))作为请求体,解码非空结构体时会返回EOF错误 - 字段类型不匹配:比如结构体中
Age字段为int,但JSON中对应值为字符串"abc",会触发类型不匹配错误 - 非法JSON值:比如使用
NaN(JSON不允许非字符串的NaN),或者未闭合的对象/数组
注意事项
- 确保设置正确的
Content-Type: application/json头,避免函数先因为请求格式不匹配报错,干扰Decode错误的测试 - 根据你的函数实际逻辑调整验证逻辑,比如检查响应体的错误信息、日志输出等,确保错误被正确处理
内容的提问来源于stack exchange,提问作者jbrre
相关产品推荐
相关产品推荐

