如何通过gmock模拟接口及其方法



下面是示例代码。当我试图模仿Circle时,它给出了一个错误,称为";错误C2027使用未定义的类型"测试::内部::函数<HRESULT(int,int(>'

class foo: public IUnknown
{
virtual HRESULT STDMETHODCALLTYPE Circle(int x, int y) = 0;
.....
.....
};

为了嘲笑这一点,我尝试了这样的东西:

class fooMock: public foo
{
public:
MOCK_METHOD2(Circle, HRESULT STDMETHODCALLTYPE(int x, int y));

};

将依赖项隐藏在接口后面是件好事。这是一个很好的练习。

现在很明显,您的界面将您与特定于windows的头文件分隔开来。这也很好,但它会导致您的错误。错误表示HRESULT符号未知。

快速脏修复是包括相应的Windows标头:winnt.h

正确的解决方案是用代表成功/错误结果的东西来代替HRESULT。它可以是bool(等于result >= 0(,也可以是long,或者它可以是表示错误/成功的某个类。选择取决于您的业务逻辑如何处理这些错误?

旁注:

注意,STDMETHODCALLTYPE用于定义函数的调用约定。它对应用程序逻辑没有影响。它影响功能的ABI。所以,当您将修改了ABI的函数隐藏在接口后面时,可以忽略此修改,并保留接口的标准ABI。

额外说明:

gmock不久前引入了更方便的方法来定义mock,这使得它们更容易手动编写(还有一个工具可以从接口生成它们(:

class fooMock: public foo
{
public:
MOCK_METHOD(long, Circle, (int x, int y), ());
// last argument can contain: "(const override noexcept)" and similar stuff
};

最新更新