我试图用虚拟系统调用包装器创建一个代理类,以便在功能代码中可以定义这些包装器以进行系统调用,但是在单元测试中,使它们成为模拟方法。这是我目前的想法,但感觉很笨拙。有没有更好的方法来实现这一目标?
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()
...
==========================单元测试项目====================== =======
测试文件
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,您可以使用技巧发表在这个问题上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句