Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用cmocka库模拟第三方库中无法修改的函数?_C_Cmake_Cmocka - Fatal编程技术网

如何使用cmocka库模拟第三方库中无法修改的函数?

如何使用cmocka库模拟第三方库中无法修改的函数?,c,cmake,cmocka,C,Cmake,Cmocka,我正在尝试使用cmocka库用c编写一个测试用例。我的测试用例正在测试一个函数,该函数在内部调用第三方库中的函数(无法修改库)。当应用程序未启动并运行时,该函数返回空值,所以我想模拟这个第三方库函数的返回值。我怎样才能实现这个呢 我曾尝试使用cmocka的will_return函数来获得所需的返回值,但它不起作用 void third_party_func() { return mock(); } void my_func_to_be_tested() { int ret; r

我正在尝试使用cmocka库用c编写一个测试用例。我的测试用例正在测试一个函数,该函数在内部调用第三方库中的函数(无法修改库)。当应用程序未启动并运行时,该函数返回空值,所以我想模拟这个第三方库函数的返回值。我怎样才能实现这个呢

我曾尝试使用cmocka的will_return函数来获得所需的返回值,但它不起作用

void third_party_func()
{
   return mock();
}
void my_func_to_be_tested()
{
   int ret;
   ret = third_party_func();
   return ret;
}
void test_do_mytest(void ** state)
{
   (void) state;
   int ret;
   will_return(third_party_func,1);
   ret = my_func_to_be_tested();
   assert_int_equal(1,ret);
}
const struct CMUnitTest tests[] = {
    cmocka_unit_test(test_do_mytest),
};


int main(void)
{
    return cmocka_run_group_tests(tests, NULL, NULL);
}
我得到了第三方函数()的多个定义的编译错误。如何处理这种情况


我想获取所需的值作为我的第三方函数的返回值。

您是否尝试过_uwrap_u;标志

将函数名称从第三方函数更改为第三方函数,并将以下指令添加到gcc中,例如使用fopen函数:

FILE * __wrap_fopen(const char *__restrict __filename,
                const char *__restrict __modes)
{
  return mock_ptr_type(FILE*);

}
并将指令添加到gcc中,如:

$ gcc -g -Wl,--wrap=fopen

希望能有帮助

你试过“包裹”标志吗

将函数名称从第三方函数更改为第三方函数,并将以下指令添加到gcc中,例如使用fopen函数:

FILE * __wrap_fopen(const char *__restrict __filename,
                const char *__restrict __modes)
{
  return mock_ptr_type(FILE*);

}
并将指令添加到gcc中,如:

$ gcc -g -Wl,--wrap=fopen
希望能有帮助