Есть ли хороший способ сделать прокси системного вызова, чтобы разрешить имитацию в модульном тесте? - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь создать прокси-класс с виртуальными оболочками системных вызовов, чтобы в функциональном коде я мог определить эти оболочки для выполнения системных вызовов, но в модульном тесте, делая их имитацией методов. Это моя текущая идея, но она кажется неуклюжей. Есть ли лучший способ добиться этого?

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>()));
}
...
...