如何用Fake Function Framework(fff) Mock模块的引用返回值?
用Fake Function Framework(FFF)伪造带指针参数的函数行为
核心思路
要在不引入queue模块的前提下控制queue_fetch()的返回值,同时通过引用设置event的值,你需要借助FFF的自定义Fake函数来完全接管queue_fetch()的行为,具体步骤如下:
步骤1:声明Fake函数
在测试文件中,先声明原函数的原型(若未包含queue模块头文件),再用FFF的宏定义Fake函数:
#include "fff.h" // 声明原函数原型(匹配实际函数签名) int queue_fetch(event_t* event); // 定义Fake函数:FAKE_VALUE_FUNC(返回值类型, 函数名, 参数类型) FAKE_VALUE_FUNC(int, queue_fetch, event_t*);
步骤2:配置Fake函数的行为
在测试用例中,通过自定义Fake函数实现对event参数的赋值,同时设置返回值:
// 自定义Fake函数,处理指针参数赋值 static int custom_queue_fetch(event_t* event) { // 给传入的event指针设置你需要的伪造数据 *event = (event_t){ .type = EVENT_TIMER, // 示例字段,替换为你的实际字段 .data = 0x1234 // 示例值,自定义为测试需要的内容 }; // 返回预设的返回值 return queue_fetch_fake.return_val; } void test_sched_step_with_valid_event(void) { // 重置Fake函数状态(每个测试用例必做,避免用例间干扰) RESET_FAKE(queue_fetch); // 绑定自定义Fake函数到queue_fetch的Fake实现 queue_fetch_fake.custom_fake = custom_queue_fetch; // 设置queue_fetch的返回值为OK queue_fetch_fake.return_val = OK; // 调用待测试的函数 sched_step(); // 验证Fake函数的调用情况 ASSERT_EQ(1, queue_fetch_fake.call_count); // 确认queue_fetch被调用1次 // 若do_something_with也被Fake,可验证它是否收到了正确的event ASSERT_EQ(EVENT_TIMER, do_something_with_fake.arg0->type); }
替代简化方案(仅验证场景)
如果不需要提前设置event,而是在调用后验证queue_fetch的参数,可直接通过FFF的参数捕获功能获取指针:
void test_sched_step_verify_event(void) { RESET_FAKE(queue_fetch); queue_fetch_fake.return_val = OK; sched_step(); // 通过queue_fetch_fake.arg0获取传入的event指针,验证其值 ASSERT_EQ(EXPECTED_EVENT_TYPE, queue_fetch_fake.arg0->type); }
关键注意点
FAKE_VALUE_FUNC适用于返回非void类型的函数,若函数返回void则用FAKE_VOID_FUNCRESET_FAKE必须在每个测试用例开头调用,重置调用计数、参数记录、返回值等状态- 自定义Fake函数可以完全控制函数逻辑,包括修改指针参数、模拟异常返回值等场景
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

