C 中的函数模拟?

2023-12-27

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

我的测试调用一个函数(我需要测试),并且该函数调用另一个二进制文件。

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

/* 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 条件,但这违反了准则。 因为它基本上是一个呼叫拦截,我不知道它是最好的(或有效的)解决方案。我可以用什么来解决它?


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

  1. 包括.c文件而不是标题.h,但是在使用定义指令“重命名”模拟函数之后:

    #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;  
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中的函数模拟? 的相关文章

随机推荐

  • 用JavaCompiler以编程方式编译java?

    我从另一个 Stack Overflow 线程中获取了这段 Java 代码 import java io import javax tools JavaCompiler import javax tools ToolProvider pub
  • JavaFX - 无法在 MenuItem 中使用下划线

    当我使用 JavaFX 创建一个程序时 遇到了一个非常奇怪的问题 我想创建一个包含下划线 的文本的 MenuItem 但是当显示该文本时 下划线消失 这是一个示例代码 public class JavaFXTest extends Appl
  • CSS3 翻译出屏幕

    现在 对于许多项目 我想将页面上的元素翻译出屏幕区域 让它们飞出文档 在正确的代码中 只需向相关元素添加一个类 然后 css 将处理其余的部分就可以实现这一点 问题在于 如果例如 block hide webkit transform tr
  • 如何将零值(向量(0)与 PromQL 中的指标值合并

    我在用着flexlm exporter https github com mjtrangoni flexlm exporter将我的许可证使用情况导出到 Prometheus 并从 Prometheus 导出到自定义服务 不是 Grafan
  • r 将数据框 R 的列表与 NULL 绑定

    我有一个像这样的数据框架结构列表 我们将此列表称为 listA data frame 1 obs of 3 variables a chr a1 b chr b1 c chr c1 NULL data frame 1 obs of 3 va
  • Android GCM time_to_live问题

    我有一个相关问题time to live 当设备打开时 我会收到消息 但当设备离线时 我不会收到消息 或者至少在前 15 分钟内不会发送消息 我在空闲时延迟发送消息 true 和time to live2419200 任何想法发生了什么 也
  • 如何在 Visual Studio 2013 中将 stdint 类型与 _tprintf 一起使用?

    举个例子 char fileName C windows system32 kernel32 dll uint32 t fileSize 1163264 printf The size of s is PRIu32 n fileName f
  • 在某些情况下,`!important` 之前的空格是否重要?如果重要,那么什么时候重要?为什么?

    我一直在尝试scssphp http leafo net scssphp 一个 PHP SCSS 编译器 特别是它的压缩的格式化程序 这会输出类似的内容 注意闭花括号之前的额外空格和分号 navbar margin bottom 0px i
  • 在 C# 中从字符串(包括 HTML 标签)创建字典或列表

    A 有一个像这样的字符串 string s tr td 11 td td 12 td tr tr td 21 td td 22 td tr tr td 31 td td 32 td tr 如何创建Dictionary
  • Cocoapods平台,到底是什么意思?

    我不清楚改变平台价值会产生什么影响 有人可以详细说明吗 这是否仅仅意味着如果不满足库的最低版本要求 就会抛出错误 https guides cocoapods org syntax podfile html platform https g
  • Android 禁用预测文本

    我想禁用预测短信 当我们通过软键盘输入时 预测短信不应出现 我只需要禁用预测短信的代码 有人可以帮助我吗 您可以在 XML 布局中设置 inputType 属性 或者使用这些值中的一个或多个 用 分隔 调用 setInputType 要禁用
  • pandas 中的分组日期索引

    我有一个数据框 如下所示 In 101 import pandas as pd df pd DataFrame date 2014 06 30 2014 06 30 2014 06 29 2014 06 29 2014 06 29 valu
  • 如何查找类中 DateTime 类型的所有属性?

    我需要调整一堆对象的日期时间 我想循环访问该类的属性 如果类型是 dateTime 则进行相应调整 我可以使用任何内置的 描述类型 吗 您可以使用反射 http msdn microsoft com en us library ms1731
  • 如何使我的单例类可扩展?

    我们的静态库之一中有一个单例类 它是一个单例 因为我们希望能够始终 记住 它的状态 本质上它是一个用户管理单例 它有一个属性User user它有诸如 void authenticateUser 我们希望将其交付给想要创建自己的客户 voi
  • 如何强制android将应用程序安装到内存上

    我有一个从私人服务器下载的应用程序 它可以在大多数手机上安装 但我在 HTC Desire C 上安装它时遇到问题 该手机没有 SD 卡 我四处搜索 发现一个清单设置应该暗示内部存储 或者说至少没有对应用程序安装位置的偏好
  • Visual Studio:我可以复制项目的属性以在另一个项目中使用吗?

    我添加了几个目录 库 例如 matlab opencv 等 来编译 Visual Studio 项目中当前的 C 文件 我即将进行的所有项目都需要相同的设置 属性 我是否需要单独设置每个项目的属性 或者我可以做一些事情将其应用到所有项目 尝
  • 检测音量按钮按下并释放 iOS [重复]

    这个问题在这里已经有答案了 可能的重复 程序访问 iPhone 音量按钮 https stackoverflow com questions 772832 program access to iphone volume buttons 是否
  • 如何合并单个数据框中具有相同索引的行?

    我有一个如下所示的数据框 A B C 1 1234 Win 1 2345 Win 2 1987 Loss 3 3456 Win 3 4567 Win 我希望这成为 A B C 1 1234 2345 Win 2 1987 Loss 3 34
  • 路由到子路由模块,无需延迟加载

    我想要多个routing模块 以保持我的应用程序干净且易于阅读 我目前使用延迟加载SubComponent但我不想这样做 所以我正在寻找一种方法来改变这种情况 无论如何 这是当前正在工作的代码 我有以下两个路由文件 app routing
  • C 中的函数模拟?

    我正在编写一个单元测试来检查一些 API 调用 我正在使用检查来测试 我的模块是使用 CMake 构建的 如果重要的话 我不知道 我的测试调用一个函数 我需要测试 并且该函数调用另一个二进制文件 它的简化版本看起来像这样 unitTest