Нельзя имитировать глобальные функции такими, какие они есть. Вместо этого вы можете добавить слой абстракции и обернуть системные вызовы в интерфейсе:
class OsInterface {
virtual pid_t fork() = 0;
}
class OsInterfaceImpl : public OsInterface {
virtual pid_t fork() override
{
return ::fork();
}
}
class OsInterfaceMock : public OsInterface {
MOCK_METHOD0(fork, pid_t());
}
Это позволяет вам выбрать реальный системный вызов или макет с помощью Внедрение зависимости . Поскольку вы не предоставили код, я не могу вам с этим помочь.
Обычно вы передаете указатель или ссылку на внедренный класс в конструктор класса, который должен его использовать, но есть несколько других методов, которые могли бы лучше подойти вашему проекту.
Дополнительным преимуществом является то, что этот код является более открытым-закрытым : Вы можете легко (ну, относительно легко) добавить, например, реализацию Windows, не изменяя существующий код - вы просто предоставите другой класс, наследующий от OsInterface
. Вам не нужно изменять какие-либо вызовы интерфейса в вашем производственном коде, просто измените внедренный класс.
Обратите внимание, что это не будет запускать никаких дополнительных процессов в модульных тестах, но это является преимуществом. Вы должны проверить код, запущенный в процессе отдельно.