我刚开始使用C中的模拟框架Cmock,并尝试开始使用它。我采用了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.
函数调用似乎无法识别..任何帮助我们都将不胜感激!利亚德
发布于 2018-08-12 03:27:01
mock是生成的代码,它与您正在mock的函数具有相同的函数签名。其结果是,您不能在同一测试可执行文件中编译和链接模拟函数和原始真实函数。C只知道如何编译和链接整个源文件。它不能选择模块中的函数来混合在一起。
简单地说,这意味着您不能对您试图测试的同一源文件中的函数进行模拟调用。这是C中基于交互的测试的基本规则。总的来说,这会带来更好的设计(尤其是在大型项目中),但它也有副作用,即更多的文件(使用更长的描述性文件名),有时还会在文件之间任意划分代码以启用模拟。
因此,最好的建议是将foo_init()从test_using_foo_init()中分离出来,放在一个单独的文件中。
一般来说,任何一个测试可执行文件都将由单个源模块和一个或多个模拟模块组成,这些模块的函数签名都在您正在测试的源代码之外。在最简单的情况下,您至少需要两个不同的模块(一个源模块和一个模拟模块)来使用模拟进行测试。
https://stackoverflow.com/questions/51800234
复制相似问题