有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
Any good way to make system call proxy to allow for mocking in unit test?
我正在尝试创建一个带有虚拟系统调用包装器的代理类,以便在函数代码中,我可以定义这些包装器来进行系统调用,但在单元测试中,使它们成为mock方法。这是我目前的想法,但感觉很笨拙。有没有更好的方法来实现这一点?
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>()));
}
...
这个想法是OK IMHO,代码也很好,我想有一点需要注意:您将MockSysCallAgent
注入为unique_ptr,这样您就不能再访问这个对象了。在GoogleMock中,您必须对测试代码中使用的同一对象设置期望值,即期望调用是模拟对象的内部状态,不会被复制等。要像这样注入unique_ptr,您可以使用本问题中发布的技术。
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 用于单元测试的模板模板
- 提升 1.64 单元测试编译失败
- 在类 gtest/gmock 进行单元测试时模拟成员函数C++
- 如何在生产中避免vtable查找,并且仍然能够在单元测试中进行广泛的模拟
- C++ 谷歌模拟/单元测试:模拟方法未调用,原始方法是
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- 如何使用gmock框架模拟c++单元测试中的fork和execlp系统调用
- 编译器错误,用静态多主体主义模拟C++单元测试
- 使用c++分层命名空间解析为单元测试提供模拟组件是一种好做法吗?< / h1 >
- 谷歌模拟单元测试
- 如何使用google test在单元测试中模拟不同的时区
- 如何在没有模拟框架的情况下对具有严重依赖关系的类进行单元测试?
- 单元测试-模拟C++标准库
- 单元测试——不直接使用被模拟对象的Google Mock (c++)
- 单元测试-我试图用googlemock模拟一个简单的c++方法有什么问题?
- 单元测试-如何模拟c++中使用RAII的类