【发布时间】:2011-12-06 15:35:18
【问题描述】:
我非常喜欢 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
【问题讨论】:
-
其实rand是一个确定性函数。它返回一个伪随机数序列。调用 rand 将返回与 srand 一起使用的任何给定种子的相同数字序列。
-
好吧,太棒了,这是真的。但是为了使示例简短易读,我没有使用种子。
-
您需要将
__wrap_foo重命名为getRandomNumber。 (xkcd.com/221)