如何在无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:myfunctionmyfunction的调用,重定向到__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
相关产品推荐
相关产品推荐

