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

如何在无CMakeLists.txt的Visual Studio C项目中使用cmocka实现函数Mock?

在Visual Studio中无CMake配置cmocka的函数Mock(__wrap_方法)

我之前也碰到过一模一样的情况,不用CMake照样能在VS里搞定cmocka的wrap功能,核心是靠VS的链接器选项实现符号重定向,下面是一步步的实操方案:

1. 梳理你的项目结构

  • 被测库项目(比如叫MyLib):包含你要Mock的目标函数,比如myfunction(int i, char *c)
  • 测试项目(比如叫MyLibTests):已经引入cmocka库,负责编写测试用例,同时实现__wrap_myfunction

2. 编写Mock函数

在你的测试源文件里,按照cmocka的规则实现wrap函数,示例如下:

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

// 声明原函数,避免编译时出现未定义符号的报错
extern void myfunction(int i, char *c);

// 实现wrap函数,签名必须和原函数完全一致
void __wrap_myfunction(int i, char *c) {
    // 这里可以用cmocka的断言验证参数,或者返回预设值
    check_expected(i);
    check_expected_ptr(c);
    // 如果原函数有返回值,比如int类型,就用mock_type返回预设值
    // return mock_type(int);
}

3. 配置测试项目的链接器选项

这是最关键的一步,CMake里的配置本质也是给链接器传参数,VS里我们手动加:

  • 右键测试项目 → 属性 → 链接器 → 输入 → 附加依赖项:确认已经添加了cmocka的库文件(比如cmocka.lib)
  • 切换到链接器 → 命令行,在附加选项里添加:
    /wrap:myfunction
    
    这个参数的作用是告诉链接器:把所有对myfunction的调用,重定向到__wrap_myfunction。如果要Mock多个函数,就追加多个/wrap:参数,比如/wrap:func1 /wrap:func2

4. 编写测试用例验证

现在就能正常用cmocka的Mock功能了,举个测试用例的例子:

static void test_myfunction_caller(void **state) {
    (void)state; // 忽略未使用的参数

    // 设置预期的参数值
    expect_value(__wrap_myfunction, i, 42);
    expect_string(__wrap_myfunction, c, "test");

    // 调用依赖myfunction的被测函数,实际会走到我们的wrap函数
    myfunction_caller();
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(test_myfunction_caller),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
}

几个注意点

  • 要Mock的函数不能是静态函数:如果原函数用static修饰,链接器无法拦截它的调用,这种情况要么去掉static,要么改用预编译宏替换的方式Mock
  • 测试项目要正确引用被测库:右键测试项目 → 属性 → 通用属性 → 框架和引用 → 添加引用,把被测库项目加进来,确保测试项目能找到原函数的声明
  • 若出现链接错误,检查/wrap参数是否正确,以及wrap函数的签名是否和原函数完全一致(包括返回值、参数类型、const修饰等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:08:14