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

如何在单元测试中模拟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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:20:32