我刚刚开始使用Cmocka,我已经坚持了一段时间了。我有一个cmocka项目,我正在尝试构建。当我尝试使用'make'时,我看到了错误。
[错误] ---没有符号__wrap_i2c_read的条目。
另外我在mock_i2c.c文件中看到一个错误,我在这里调用mock()
无法获取模拟函数__wrap_i2c_read的值。
现在我只是想模拟一个真/假值来让它工作。所以我的模拟看起来像
bool __wrap_i2c_read(void)
{
return (mock());
}
我在测试中检查过我正在调用will_return(__wrap_i2c_read, true);
在我的Makefile中,我有LDFLAGS += -Wl,--wrap=i2c_read
我在mock_i2c.c文件中包含cmocka.h
。
这对于这个模拟函数似乎没有特别的问题,因为如果我不使用它,我会得到该文件中其他模拟函数的相同错误。 我不确定还需要其他信息,请告诉我。任何人都知道这意味着什么/看过这个?
感谢。
编辑:所以我想我已经弄清楚为什么我会收到这个错误。我正在测试的函数中有一个for
循环。从这个函数调用模拟函数。一旦我删除循环,错误消失。这可能与will_return
对模拟值排队的方式/时间有关吗?并且for
循环正在阻碍?
Edit2:好的,所以我似乎没有排队足够的模拟值。
答案 0 :(得分:1)
你的编辑2是线索!
您必须在调用will_return
时经常致电mock
。
对于你的FUT的每次调用(被测功能),调用mock()
。所以你需要在调用FUT之前使用will_return
,因为你要打电话给你的FUT。 will_return
将一个元素放入堆栈。 mock()
将从此堆栈中获取一个元素。因此,调用will_return
一次并mock()
两次将导致下溢,最终会出现在您提到的cmocka错误中。
也许您想使用will_return_always
或will_return_count
。