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

Fabric链码单元测试:如何构造Unmarshal通过但Marshal失败的测试用例

解决方案

方案1:修改DocData结构体增加不可序列化字段(最简单实现)

Go标准库的json.Marshal遇到可导出的不可序列化类型字段(函数、通道、复数类型、循环引用结构体等)时会直接抛出错误,你可以利用这个特性构造目标场景:

  1. 调整DocData结构体定义,增加一个可导出的不可序列化类型字段,不需要加json标签:
type DocData struct {
    Key1     string `json:"key1"`
    Key2     string `json:"key2"`
    DataType string `json:"dataType"`
    // 新增字段:函数类型属于json不支持序列化的类型
    BadField func()
}
  1. 构造测试用的JSON输入时,不需要包含BadField对应的字段:
    因为json.Unmarshal遇到输入JSON中不存在的结构体字段会直接忽略,赋值为对应类型的零值,所以Unmarshal过程不会报错,而后续执行json.Marshal时,会检测到可导出字段BadField是不可序列化的函数类型,直接抛出错误。
  2. 新增测试用例:
// 触发json.Marshal失败分支的测试用例
_, err = c.CreateAsset(ctx, `{"key1":"test001","key2":"test002"}`)
assert.EqualError(t, err, "failed docData bytes marshalling: json: unsupported type: func()")

如果担心新增字段影响生产环境,可以给这个字段加上测试编译标签,生产编译时会自动忽略该字段:

type DocData struct {
    Key1     string `json:"key1"`
    Key2     string `json:"key2"`
    DataType string `json:"dataType"`
    // +build test
    BadField func()
}

方案2:不修改生产代码,用猴子补丁替换json.Marshal实现

如果你不希望调整生产代码的结构体定义,可以在单元测试中使用猴子补丁技术,临时替换json.Marshal的实现,当检测到入参是你构造的测试用DocData实例时,直接返回自定义错误,测试执行完成后再恢复原实现即可。

内容的提问来源于stack exchange,提问作者Matias Salimbene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:57:02