我正在编写单元测试(在 cpputest 中),我尝试对函数调用执行“依赖注入”。这意味着当单元测试必须调用放置在被测文件中的实际函数时,函数调用应该被重定向到“假”实现。实际上我正在为真实函数分配函数指针并用“伪实现”覆盖它。它的构造如下:
============ myfile.h =========================
int8 my_function_FAKE (int8 address) // Declaration of my_function_FAKE
==============================================
================= myfile.c ====================
#include "myfile.h"
static int8 my_function (int8 address) // The original function
{
return value;
}
#IF DEFINED (UNIT_TEST)
int8 my_function_FAKE (int8 address) // the "fake" of the original function
{
switch (address)
{
case 10: return 11
case 20: return 21
case 30: return 31
}
}
#ENDIF
======================TEST ENVIRONMENT =======================
==============================================================
========FAKE.h===============
extern int8(*Function)(int8);
=========================
========FAKE.c==========
#include "myfile.h"
#include "FAKE.h"
int8 (*Function)(int8) = my_function;
=========================
=======Unit Test File======
Function = my_function_FAKE; // Injecting the fake implementation within unit test file
===========================
我收到编译错误:
FAKE.c: error C2065: 'my_function' : undeclared identifier
FAKE.c: error C2099: 'my_function' : initializer is not a constant
我已尝试过一些组合,但每次都出现同样的错误。解决方案可能很简单,但我忽略了它。那么,我在这里做错了什么?
答案 0 :(得分:0)
我发现您的代码存在更多问题:
my_function
是一个静态函数,因此您无法从另一个编译单元到达(您应该将其声明修改为非静态)
int8 (*Function)(int8)
是一个函数指针声明,因此您需要my_function
的地址。您的代码(FAKE.c
)看起来应该类似:
extern int8 my_function (int8 address);
int8 (*Function)(int8) = &my_function;
同样在您的单元测试中,您应该使用my_function_FAKE的地址:
Function = &my_function_FAKE;