kzaiwo
kzaiwo

Reputation: 1748

GMock - Mocking an abstract class with another implementation

I am trying to mock IAudioMeterInformation Windows API (I just need GetPeakValue() method).

I was getting an error:

Error C2259 'AudioMeterInformationMock': cannot instantiate abstract class

So I tried to create a custom implementation of GetPeakValue() in my mock:

#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;
   }
};

And I call it in my tests:

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

But I am still getting the same error message:

Error C2259 'AudioMeterInformationMock': cannot instantiate abstract class

Any idea what I'm doing wrong?

Thanks!


UPDATE:

Turns out I have to "implement" all other pure virtual funcs to make it work.

    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**));

It is now working as expected.

Upvotes: 2

Views: 1435

Answers (1)

kzaiwo
kzaiwo

Reputation: 1748

UPDATE:

Turns out I have to "implement" all other pure virtual funcs to make it work.

    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**));

It is now working as expected.

Upvotes: 2

Related Questions