有什么好的方法可以使系统调用代理允许在单元测试中进行模拟?

Any good way to make system call proxy to allow for mocking in unit test?

我正在尝试使用虚拟系统调用包装器创建代理 class,以便在功能代码中,我可以定义这些包装器来进行系统调用,但在单元测试中,使它们成为模拟方法。这是我目前的想法,但感觉很笨拙。有没有更好的方法来实现这个?

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

==========================单元测试项目================ ============

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

这个想法是好的恕我直言,代码也很好我想有一个警告:你正在注入 MockSysCallAgent 作为 unique_ptr 所以你不能再访问这个对象.在 GoogleMock 中,您必须在被测代码中使用的同一对象上设置期望,即期望调用是模拟对象的内部状态,不会被复制等。要像这样注入 unique_ptr您可以使用 .

中发布的技术