C 中的函数模拟?

Function mocking in C?

我正在编写单元测试来检查一些 API 调用。我正在使用检查来测试。我的模块是用 CMake 构建的(idk 如果重要的话)。

我的测试调用了一个函数(我需要测试它),这个函数调用了另一个二进制文件。

它的简化版本看起来像这样。

/* unitTest.c */

#include "libraryAPI.h"
void letsMakeACall(void)
{
   ck_assert_eq(foo("water"), 0);
}

-- Module I am working on---
/*libraryAPI.c*/
#include "legacyLib.h"

void foo(const char *drink )    
{

    if (checkDrink(drink)!=0)
    {
       return 1;
    }else
    {
       return 0;
    }
}


----LEGACY BINARY---
/*legacyLib.c*/

static const char* expected = "water";

void checkDrink(const char *drink)
{
    if(drink == expected)
     {
        /*There are also a dozen functions being called which depend on legacy module initialisation*/
        return 0;
     }else{
        return 1;
     }
}

我想模拟来自 legacyLib 的响应,否则它会调用许多函数和中断。我最初的想法是在测试 运行 时添加一些 ifdef 条件,但这违反了准则。 因为它基本上是一个呼叫拦截,所以我不知道什么是最好的(或有效的)解决方案。我可以用什么来解决它?

我也不确定一般如何解决这个问题,我已经发布了一个 similar question,但在某些情况下,您可以执行以下操作(假设您正在测试单个功能):

  1. 包含 .c 文件而不是 header .h,但是在 "rename" 使用定义指令的模拟函数之后:

    #define checkDrink checkDrink_mocked
    // preprocessor will now replace all occurrences of "checkDrink"
    // with "checkDrink_mocked"
    
    int checkDrink_mocked(const char *drink); 
    #include "legacyLib.c"
    #undef checkDrink
    
  2. 实现重命名的函数:

    int checkDrink_mocked(const char *drink)
    {
        return 15;  
    }