首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Google Mocks模拟免费函数

使用Google Mocks模拟免费函数
EN

Stack Overflow用户
提问于 2012-07-02 17:45:18
回答 3查看 3.9K关注 0票数 2

我有以下免费函数sig:

代码语言:javascript
复制
ReturnT getFirstAttributeHandle(ParentHandleT a, AttributeHandleT* b);

我需要将这样一个函数的地址传递给迭代器的构造函数,该构造函数迭代这些句柄。由于此函数的具体实现访问外部依赖项,因此我需要模拟它。

我想用google mock来模拟这个功能,但我不确定怎么做。

这是我尝试过的:

代码语言:javascript
复制
class IAttributeIterator
{
public:
    virtual ReturnT getFirstAttributeHandle(ParentHandleT a, AttributeHandleT* b) = 0;
};

class MockAttributeIterator : public IAttributeIterator
{
public:
    MOCK_METHOD2(getFirstAttributeHandle, ReturnT(ParentHandleT a, AttributeHandleT* b));
};

然后就像这样:

代码语言:javascript
复制
MockAttributeIterator i;
AttributeIterator iter = AttributeIterator(i.getFirstAttributeHandle);
iter++;

但是这不能编译,给出了错误:

'MockAttributeIterator::getAttribute':函数调用缺少参数列表;使用'&MockAttributeIterator::getAttribute‘创建指向成员的指针

我该怎么做有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2012-07-02 18:21:02

不,您不能将指向成员函数的指针转换为函数指针(这是编译器所说的)。

如果AttributeIterator的构造函数接受指向函数的指针,则需要创建一个伪函数,该函数调用MockAttributeIterator上的getFirstAttributeHandle方法。如下所示:

代码语言:javascript
复制
namespace
{
    MockAttributeIterator mockObj;
    ReturnT FakeHandle(ParentHandleT a, AttributeHandleT* b)
    {
      mockObj.getFirstAttributeHandle( a, b );
    }
}

并将指向FakeHandle的指针传递给AttributeIterator的构造函数。

顺便说一句,我刚刚检查了gmock常见问题,这里甚至有解释(链接是here)。

这里有几件事:

  • 上面发布的代码最好放在匿名名称空间
  • 中,以清除测试之间的期望,在您的setup方法中(每个单元测试框架都有一个),执行以下操作:

setUp() { ::testing::Mock::VerifyAndClearExpectations( &mockObj ):}

票数 2
EN

Stack Overflow用户

发布于 2014-02-20 17:24:48

这个问题与google mock一点关系都没有,编译器抱怨的是下面的语句:

代码语言:javascript
复制
AttributeIterator iter = AttributeIterator(i.getFirstAttributeHandle);

注意i.getFirstAttributeHandle表达式,它是一个调用的成员函数,因此编译器试图匹配函数签名,但什么也得不到。

如果你想将部分应用的函数安全地传递给另一个类,请尝试使用boost.function/bind,使用原始函数指针是非常危险且容易出错的。

票数 1
EN

Stack Overflow用户

发布于 2013-06-05 14:57:00

您可以将自由函数封装在代理类中,然后模拟对代理方法的调用。以下代码概述了如何在代码中模拟CreateFileWCloseHandle调用。

gmock Cookbook中也概述了基本思想。

代码语言:javascript
复制
/// 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);
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11291213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档