Я пытаюсь создать прокси-класс с виртуальными оболочками системных вызовов, чтобы в функциональном коде я мог определить эти оболочки для выполнения системных вызовов, но в модульном тесте, делая их имитацией методов. Это моя текущая идея, но она кажется неуклюжей. Есть ли лучший способ добиться этого?
SysCallAgent.hpp
#include <string>
#include <memory>
class SysCallAgent
{
public:
SysCallAgent(){}
virtual ~SysCallAgent(){}
static SysCallAgent& instance()
{
if(!_pInstance)
{
_pInstance = std::move(std::make_unique<SysCallAgent>());
}
return *_pInstance.get();
}
//reset is for setting instance as mock object in unit test
static void reset(std::unique_ptr<SysCallAgent>&& pInstance)
{
_pInstance = std::move(pInstance);
}
virtual void system_call1();
virtual void system_call2();
...
private:
static std::unique_ptr<SysCallAgent> _pInstance;
};
======================= == проект функционального кода ========================
SysCallAgent. cpp
void SysCallAgent::system_call1()
{
/// make the actual system call
}
void SysCallAgent::system_call1()
...
========================== проект модульного тестирования ===================== =======
тест. cpp
class MockSysCallAgent : public SysCallAgent
{
MOCK_METHOD0(system_call1, void());
MOCK_METHOD1(system_call2, void());
....
}
TEST(test, test)
{
SysCallAgent::reset(std::move(std::unique_ptr<MockSysCallAgent>()));
}
...