我喜欢GNU链接器功能来包装很多函数。我通常用它来模拟,例如非确定性函数调用如rand()
。考虑以下示例,我想为giveMeANumber
编写单元测试:
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
我可以使用GNU链接器功能包装来调用rand,如下所示:
//test.cpp
extern "C" int __wrap_rand(void) {
return 4;
}
void unitTest() {
assert giveMeANumber() == 5;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=rand
有没有办法对普通的C ++函数做同样的事情?以下不起作用,我猜是因为名称错误。但即使我用错误的名字尝试它也不起作用。
//number.cpp
int foo() {
//some complex calculations I would like to mock
}
int giveMeANumber() {
return foo() % 6 + 1;
}
//test.cpp
extern "C" int __wrap_foo(void) {
return 4;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=foo
答案 0 :(得分:9)
您还需要extern "C"
要包装的函数(如果可能)或者您需要包含错位的名称,例如__wrap__Z3foov
然后将--wrap=_Z3foov
传递给接头
获得正确的下划线有点棘手。这对我有用:
$ cat x.cc
#include <iostream>
using namespace std;
int giveMeANumber();
int main() {
cerr << giveMeANumber() << endl;
return 0;
}
$ cat y.cc
int giveMeANumber() {
return 0;
}
extern "C" int __wrap__Z13giveMeANumberv() {
return 10;
}
$ g++ -c x.cc y.cc && g++ x.o y.o -Wl,--wrap=_Z13giveMeANumberv && ./a.out
10
答案 1 :(得分:1)
您似乎正在尝试模拟函数和类以进行测试。您是否考虑过使用 Google Mock