Cmock 无法识别函数调用

Posted

技术标签:

【中文标题】Cmock 无法识别函数调用【英文标题】:Cmock doesn't recognise function calls 【发布时间】:2018-08-11 13:43:32 【问题描述】:

我是 Cmock 的新手,C 中的一个模拟框架,并试图开始使用它。 我采用了 exmaples 目录中提供的“make_example”并对其进行了一些修改。 我的代码出现在下面:

/////////////////////////// foo.c ///////////////////////////
#include "foo.h"

int foo_init(int number)

    return 0;


int func_using_foo_init(int number)

    int ret = -1;

    ret = foo_init(number);
    return ret;

//////////////////////////////////////////////////////

/////////////////////////// test_main.c ///////////////////////////

#include "unity.h"
#include "mock_foo.h"

void setUp(void)



void tearDown(void)



void test_main_should_initialize_foo(void)

    int ret = -1;
    foo_init_ExpectAndReturn(1, 0);

    ret = func_using_foo_init(1);
    TEST_ASSERT_FALSE(ret);

//////////////////////////////////////////////////////

运行显示的测试时,出现下一个错误: FAIL:Function func_using_foo_init. Called more times than expected.

此外,如果我添加对 func_using_foo_init_ExpectAndReturn 的调用,我会收到下一个错误: Function foo_init. Called less times than expected.

似乎无法识别函数调用.. 任何帮助将不胜感激! 利亚德

【问题讨论】:

【参考方案1】:

模拟是生成的代码与您要模拟的函数具有相同的函数签名。结果是您不能将模拟函数和原始真实函数编译并链接到同一个测试可执行文件中。 C 只知道如何编译和链接整个源文件。它不能选择模块内部的函数来混合在一起。

简而言之,这意味着您不能对位于您尝试测试的同一源文件中的函数进行模拟调用。这是 C 中基于交互的测试的基本规则。总的来说,这会带来更好的设计(尤其是在大型项目中),但它确实具有更多文件的副作用(使用更长的描述性文件名),有时还有任意划分文件之间的代码以启用模拟。

因此最好的建议是将 foo_init() 与 test_using_foo_init() 放在一个单独的文件中。

一般来说,任何一个测试可执行文件都将由一个源模块和一个或多个模拟模块组成,这些模块的函数签名都在您正在测试的源之外。在最简单的情况下,您需要至少两个不同的模块(一个源模块和一个模拟模块)来使用模拟进行测试。

【讨论】:

以上是关于Cmock 无法识别函数调用的主要内容,如果未能解决你的问题,请参考以下文章

Angular - 单元测试间谍无法识别该函数已被调用

调用未定义的函数 imagecreatefromjpeg() GD 已安装但无法识别

c++程序中,无法识别中文路径怎么办

PIL.UnidentifiedImageError:无法识别图像文件

在 CMock 中使用 ExpectWithArray 的示例

Qt软件开发_解决中文路径无法识别问题