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

时间:2019-03-26 09:32:34

标签: c cmake cmocka

我正在尝试使用cmocka库在c语言中编写一个测试用例。我的测试用例正在测试一个函数,然后该函数在内部从第3方库中调用一个函数(无法修改该库)。当应用程序不存在时该函数返回NULL值启动并运行,所以我想模拟该第三方库函数的返回值。我该如何实现?

我尝试使用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);
}

我收到针对third_party_func()的多个定义的编译错误。如何处理这种情况?

我想获得期望的值作为我的第三方功能的返回值。

1 个答案:

答案 0 :(得分:0)

您是否尝试过__wrap_标志?

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

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

}

并将指令添加到gcc中,如下所示:

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

希望会有所帮助!