Можно ли имитировать системные вызовы (например, mallo c) без изменения исходного кода с помощью gmock? - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы смоделировать системные вызовы, такие как malloc / file-open, для модульного тестирования моего кода без изменения рабочего кода. Кроме того, создание оболочек для этих системных вызовов в исходном коде неосуществимо, и, следовательно, эта опция исключена.

Любые входные данные / решения для них будут полезны.

1 Ответ

0 голосов
/ 20 марта 2020

Пересматривать системные вызовы проблематично 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 ...

...