使用谷歌模拟模拟免费功能
Mocking a free function using Google Mocks
我有以下自由函数sig:
ReturnT getFirstAttributeHandle(ParentHandleT a, AttributeHandleT* b);
我需要将这样一个函数的地址传递给迭代这些句柄的迭代器的构造函数。由于此函数的具体实现访问了外部依赖项,因此我需要对其进行模拟。
我想使用谷歌模拟来模拟这个功能,但我不确定如何。
这是我尝试过的:
class IAttributeIterator
{
public:
virtual ReturnT getFirstAttributeHandle(ParentHandleT a, AttributeHandleT* b) = 0;
};
class MockAttributeIterator : public IAttributeIterator
{
public:
MOCK_METHOD2(getFirstAttributeHandle, ReturnT(ParentHandleT a, AttributeHandleT* b));
};
然后像这样:
MockAttributeIterator i;
AttributeIterator iter = AttributeIterator(i.getFirstAttributeHandle);
iter++;
但这不会编译,给出错误:
'MockAttributeIterator::getAttribute':函数调用缺少参数列表;使用'&MockAttributeIterator::getAttribute'创建指向成员的指针
关于我如何做到这一点的任何建议?
不,您不能将指向成员函数的指针转换为函数指针(这就是编译器所说的)。
如果 AttributeIterator 的构造函数接受指向函数的指针,那么你需要创建一个假函数,该函数在 MockAttributeIterator 上调用 getFirstAttributeHandle 方法。像这样:
namespace
{
MockAttributeIterator mockObj;
ReturnT FakeHandle(ParentHandleT a, AttributeHandleT* b)
{
mockObj.getFirstAttributeHandle( a, b );
}
}
并将指向 FakeHandle 的指针传递给 AttributeIterator 的构造函数。
顺便说一句,我刚刚检查了 gmock 常见问题解答,这甚至在那里进行了解释(这是链接)。
有几件事:
- 上面发布的代码最好放在匿名命名空间中
若要清除测试之间的期望,请在设置方法(每个单元测试框架都有一个)中执行以下操作:
void setUp() { ::testing::Mock::VerifyAndClearExpectations( &mockObj ): }
谷歌模拟完全无关,编译器抱怨以下语句:
AttributeIterator iter = AttributeIterator(i.getFirstAttributeHandle);
注意表达式作为i.getFirstAttributeHandle
,这是一个成员函数调用,所以编译器试图匹配函数签名,但一无所获。
如果要将部分应用的函数安全地传递给另一个类,请尝试使用boost.function/bind
相反,使用原始函数指针非常危险且容易出错。
您可以将 free 函数封装在代理类中,然后模拟对代理方法的调用。以下代码概述了如何执行此操作以模拟代码中的CreateFileW
和CloseHandle
调用。
基本思想也在gmock食谱中概述。
/// Common Interface
class IWindows
{
public:
virtual HANDLE CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = 0;
virtual BOOL CloseHandle(HANDLE hObject) = 0;
};
/// Implementation
class WindowsWrapper : public IWindows
{
public:
WindowsWrapper(void);
virtual ~WindowsWrapper(void);
virtual HANDLE CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
virtual BOOL CloseHandle(HANDLE hObject);
};
/// Mock
class MockWindowsWrapper : public IWindows
{
public:
MockWindowsWrapper() {}
virtual ~MockWindowsWrapper() {}
MOCK_METHOD7(CreateFileW, HANDLE(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile))`
{
return ::CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
MOCK_METHOD1(CloseHandle, BOOL(HANDLE hObject))
{
return ::CloseHandle(hObject);
}
};
- 如何使用Google Mock来模拟gettimeofday()
- G锁定铸造到基础上会释放模拟行为
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 落砂模拟碰撞检测C++和SFML
- 在gtest.中使用fff.h模拟系统API
- 谷歌模拟和覆盖关键字
- 用C#中的并集模拟C++嵌套结构
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 如何模拟不同边数的骰子滚动?
- 模拟持久按键
- 使用SIR模型的疾病爆发模拟
- 如何在cpp中删除(免费)多维结构内存?
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 存储在堆分配向量中的指针的免费存储
- 转发变量参数列表以模拟 std::thread
- 如何在谷歌模拟中匹配 C 样式数组
- 在Google模拟中双免费
- 使用谷歌模拟模拟免费功能