GMock-模拟抽象类与另一个实现

时间:2019-07-16 03:02:04

标签: c++ windows api googletest gmock

我正在尝试模拟IAudioMeterInformation Windows API(我只需要GetPeakValue()方法)。

我遇到错误:

Error C2259 'AudioMeterInformationMock': cannot instantiate abstract class

因此,我尝试在模拟中创建GetPeakValue()的自定义实现:

#include <gmock/gmock.h>

class AudioMeterInformationMock : public IAudioMeterInformation
{
public:
   MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetPeakValueMod, HRESULT(float *pfPeak));

   virtual HRESULT STDMETHODCALLTYPE GetPeakValue(float *pfPeak)
   {
    *pfPeak = 1.0;
    GetPeakValueMod(pfPeak);
    return S_OK;
   }
};

我在测试中称它为

std::unique_ptr<AudioMeterInformationMock> audioMeterMock_ = std::make_unique<AudioMeterInformationMock>();
EXPECT_CALL(*audioMeterMock_, GetPeakValueMod(_))
    .WillOnce(Return(S_OK));

但是我仍然收到相同的错误消息:

Error C2259 'AudioMeterInformationMock': cannot instantiate abstract class

知道我在做什么错吗?

谢谢!


更新:

原来,我必须“实现”所有其他纯虚拟功能才能使其正常运行。

    MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetPeakValueMod, HRESULT(float *pfPeak));
    MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetMeteringChannelCount, HRESULT(_Out_  UINT *pnChannelCount));
    MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetChannelsPeakValues, HRESULT(UINT32 u32ChannelCount, float *afPeakValues));
    MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryHardwareSupport, HRESULT(_Out_  DWORD *pdwHardwareSupportMask));

And IUnknown methods:
    MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG()); \
    MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG()); \
    MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryInterface, HRESULT(const IID&, void**));

它现在按预期工作。

1 个答案:

答案 0 :(得分:0)

更新:

原来,我必须“实现”所有其他纯虚拟功能才能使其正常运行。

    MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetPeakValueMod, HRESULT(float *pfPeak));
    MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetMeteringChannelCount, HRESULT(_Out_  UINT *pnChannelCount));
    MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetChannelsPeakValues, HRESULT(UINT32 u32ChannelCount, float *afPeakValues));
    MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryHardwareSupport, HRESULT(_Out_  DWORD *pdwHardwareSupportMask));

And IUnknown methods:
    MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG()); \
    MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG()); \
    MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryInterface, HRESULT(const IID&, void**));

它现在按预期工作。