Пересматривать системные вызовы проблематично c, так как те же функции могут также использоваться самими gtest и gmock. И, поскольку оборачивать их в исходный код тоже нельзя, возможно, осталось не так уж много возможностей.
Одна вещь, которую вы можете попробовать, - это использовать препроцессор для замены этих вызовов при компиляции файла исходного кода. , Это не соответствует стандарту, но обычно будет работать. Давайте предположим, что код, который вам нужно проверить, находится в файле foo.cpp
. Этот файл foo.cpp
включает в себя a.h
и b.h
, а для malloc
, <cstdlib>
.
вы хотите #define malloc malloc_mock
, но заставить его работать (по крайней мере, вероятно) - как я уже сказал, это несоответствующий хак), вы должны сделать это следующим образом, в своем файле foo_test.cpp
:
#include <a.h> // before malloc is re-defined
#include <b.h> // also before re-defining malloc
#include <cstdlib> // and again
// Now all files are included that foo.cpp also includes.
// Let's hope every file has an include-guard in place ...
void* malloc_mock (size_t size);
#define malloc malloc_mock
// now, in the code of foo.cpp, all calls to malloc are substituted:
#include "foo.cpp" // include guards protect a.h etc. from being affected
#undef malloc
... your tests come here
Уродлив? Конечно. Но ограничения исходили от вас, поэтому не просите ничего прекрасного.
Просто замечание: в особом случае насмешки malloc
Я бы предположил, что вы пытаетесь реализовать некоторую проверку утечки памяти - если это так, я рекомендую не издеваться над ним, а вместо этого запускать свои юнит-тесты под valgrind ...