我喜欢GNU链接器的功能来包装很多功能。我通常使用它模拟例如像rand()这样的非确定性函数调用。看看下面的例子,我想编写giveMeANumber单元测试:用GNU链接器包装C++函数
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
我可以换调用兰德与GNU链接功能包装是这样的:
//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
任何想法?
实际上,rand是一个确定性函数。它返回一个伪随机数字序列。调用rand将返回与srand一起使用的任何给定种子的相同数字序列。 – TJD
好的,布拉沃,这是真的。但为了保持这个例子简短易读,我没有使用种子。 – Mike
您需要将'__wrap_foo'重命名为'getRandomNumber'。 (http://xkcd.com/221/) –