Ceedling/CMock添加va_list到:treat_as_array触发TypeError求助
CMock Mocking Functions with va_list Parameters: Configuration Error or Unsupported Feature?
环境信息
- Ubuntu 18.04.2
- Ceedling 0.31.1、Unity 2.5.4、CMock 2.5.4
问题场景
我正在给非开源遗留代码开发单元测试,无依赖模块的自动生成测试运行正常,但在mock带va_list参数的函数void tx_push(struct txbuffer *tx, const char *format, va_list ap)时遇到问题:
- 未配置
:treat_as_array时,该函数的mock生成失败,其他无va_list参数的依赖模块测试正常; - 按提示将
va_list加入:treat_as_array配置后,触发新错误TypeError: no implicit conversion of String into Integer。
想确认这是框架不支持的特性,还是我的配置有误。
问题分析与解决建议
1. 首先排查配置格式错误
你遇到的TypeError大概率是:treat_as_array的配置写法不对。CMock的这个配置需要为指定类型声明处理方式,不能只写类型名。正确的配置格式应该在project.yml中这样写:
:cmock: :treat_as_array: va_list: nil
这里的nil表示让CMock动态处理va_list的长度(因为va_list本质是一个指针或结构体,长度随平台变化)。如果直接写va_list:或者只填类型名,就会触发类型转换错误。
2. 旧版本CMock的va_list支持限制
CMock 2.5.4属于比较早期的版本,对va_list这类特殊类型的mock支持并不完善。即使配置正确,也可能因为框架本身的局限性,无法正确生成带va_list参数的mock函数代码。
3. 替代解决方案
如果修正配置后仍然报错,可以尝试以下几种方法:
- 升级框架版本:CMock 3.x及以上版本对可变参数和
va_list的处理逻辑有明显改进,升级Ceedling(连带Unity、CMock)后大概率能解决问题; - 封装目标函数:在被测代码中对
tx_push做一层简单封装,比如新增一个接收va_list之外的可变参数版本(如tx_push_fmt(struct txbuffer *tx, const char *format, ...)),让被测代码调用封装后的函数,这样mock封装函数会更简单; - 手动编写mock:跳过CMock自动生成逻辑,自己编写
tx_push的mock实现,直接在mock代码中处理va_list参数(比如忽略参数、记录调用次数等)。
内容的提问来源于stack exchange,提问作者user9230866
相关产品推荐
相关产品推荐

