【发布时间】:2017-11-11 21:28:29
【问题描述】:
我正在尝试为不使用 OO 的 C++ 库实现一些单元测试(所有函数都在命名空间级别声明)
为此,我正在尝试创建一个模拟(模拟)某些功能的测试二进制文件。
对于我直接调用的函数,我已经实现了上述功能,但是我无法替换库函数所做的调用。下面的例子解释了这一点:
生产代码
假设这是生产代码,使用真实函数而不是模拟函数的代码:
CameraHandler.H
namespace Cam {
int myFunc();
int myFunc2();
}
CameraHandler.cpp
#include "CameraHandler.h"
using namespace Cam;
int Cam::myFunc() {
// Imagine this is the function I want to simulate with a mock
// Its mangled name is _ZN3Cam6myFuncEv
return 1;
}
int Cam::myFunc2(){
return Cam::myFunc() + 11;
}
测试代码
这是单元测试的代码。正如您在 Makefile 中看到的,它会生成一个名为 testsMain 的二进制文件。
CameraHandlerMock.h
extern "C" {
int __wrap__ZN3Cam6myFuncEv(); // mangled name of Cam::myFunc(), with the __wrap_ prefix.
}
CameraHandlerMock.cpp
#include "CameraHandlerMock.h"
int __wrap__ZN3Cam6myFuncEv(){
// As you can see, the mocked function returns 999 instead of 1.
return 999;
}
UnitTestsMain.cpp
#include <iostream>
#include <typeinfo>
#include "CameraHandler.h"
#include "CameraHandlerMock.h"
extern "C" int _ZN3Cam6myFuncEv();
int main(){
std::cout << Cam::myFunc() << std::endl;
std::cout << Cam::myFunc2() << std::endl;
return 0;
}
Makefile
WRAP=-Wl,--wrap,_ZN3Cam6myFuncEv
all: production unitTests
production: // does not matter for this example
g++ main.cpp CameraHandler.cpp -o main
unitTests:
g++ ${WRAP} UnitTestsMain.cpp CameraHandlerMock.cpp CameraHandler.cpp -o testsMain
问题
如果我执行testsMain 程序,我会得到以下结果:
999 // call to Cam::myFunc()
12 // Cam::myFunc2(), which is Cam::myFunc() + 11.
考虑到Cam::myFunc2() 调用Cam::myFunc1(),并且我已将其替换为__wrap__ZN3Cam6myFuncEv,我期望调用Cam::myFunc2() 的结果是999 + 11 = 1010。尽管如此,Cam::myFunc2() 仍在调用未包装的Cam::myFunc1(),因此结果为12。
有什么方法可以包装我要测试的库内部调用的函数?
【问题讨论】:
标签: c++ unit-testing linker mocking ld