Мне очень нравится функциональность компоновщика GNU для обертывания функций. Обычно я использую ее для насмешек, например, над недетерминированными вызовами функций типа rand()
. Рассмотрим следующий пример, где я хочу написать модульный тест для giveMeANumber
:
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
Я могу обернуть вызов rand с помощью функциональной обертки GNU linker вот так:
//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