我喜歡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/) –