如何使用cpputest在单元测试中注入依赖性

时间:2017-03-27 15:54:29

标签: unit-testing mocking cpputest

我正在编写单元测试(在 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 

我已尝试过一些组合,但每次都出现同样的错误。解决方案可能很简单,但我忽略了它。那么,我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在更多问题:

  1. my_function是一个静态函数,因此您无法从另一个编译单元到达(您应该将其声明修改为非静态)

  2. int8 (*Function)(int8)是一个函数指针声明,因此您需要my_function的地址。您的代码(FAKE.c)看起来应该类似:

     extern int8 my_function (int8 address);
     int8 (*Function)(int8) = &my_function;
    
  3. 同样在您的单元测试中,您应该使用my_function_FAKE的地址:

     Function = &my_function_FAKE;