Go测试GetCats查询MySQL报空指针但Postman/Curl请求正常如何解决
问题根因
你遇到的空指针panic完全是单元测试的初始化遗漏导致的,和你写的COALESCE逻辑没有关系:
- 用Postman调用时,你已经提前启动了完整服务,服务启动阶段会执行数据库连接初始化逻辑,给全局
Db变量赋值为有效连接对象,因此调用Db.Query不会有问题。 - 执行单元测试时,Go测试框架只会执行测试文件内的相关逻辑,不会自动运行你服务启动时的数据库初始化代码,此时全局
Db变量还是零值nil,调用nil.Query()直接触发空指针panic。
修复方案
方案1:快速适配现有代码
在TestGetCats函数开头添加和生产环境一致的数据库初始化逻辑,确保Db被正确赋值后再执行接口调用,建议连接本地测试库避免影响生产数据。同时你现在的业务代码中没有处理Db.Query返回的err,建议补上错误判断避免后续其他异常触发panic。
方案2:更规范的单元测试写法
重构handler逻辑,用依赖注入替代全局Db对象:将数据库连接作为handler结构体的成员传入,单元测试时可以用mock数据库工具模拟数据库返回,不需要依赖真实的MySQL实例,测试运行更快且结果稳定。
内容的提问来源于stack exchange,提问作者sensazn
相关产品推荐
相关产品推荐

