0

我是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.

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

4

1 回答 1

2

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

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

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

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

于 2018-08-11T19:27:00.550 回答