我是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.
似乎无法识别函数调用。 任何帮助将不胜感激! 骗了
答案 0 :(得分:0)
生成的模拟代码具有与您要模拟的函数相同的函数签名。结果是,不能在同一测试可执行文件中将模拟函数和原始实函数编译并链接在一起。 C只知道如何编译和链接整个源文件。它无法在模块内部选择和混合功能。
简单地说,这意味着您无法对要测试的源文件中的函数进行模拟调用。这是C语言中基于交互的测试的基本规则。总的来说,这会导致更好的设计(尤其是在大型项目中),但确实会带来更多文件(带有更长的描述性文件名)以及有时任意划分的副作用文件中的代码以启用模拟。
因此,最好的建议是将foo_init()与test_using_foo_init()放在单独的文件中。
通常来说,任何一个测试可执行文件都将由一个源模块和一个或多个模拟模块组成,这些模块的功能签名都在您要测试的源代码之外。在最简单的情况下,您至少需要两个不同的模块(一个源和一个模拟模块)来进行模拟测试。