0

I have two interfaces I like to mock. Unfortunately one depends on the other and vice versa. The ICredentialProviderCredentialEvents has a methods that expect ICredentialProviderCredential as a parameter. ICredentialProviderCredential has a method that expects ICredentialProviderCredentialEvents as a parameter:

class MockCredentialEvents : public ICredentialProviderCredentialEvents
{
    MOCK_METHOD0(Release, ULONG());
    MOCK_METHOD0(AddRef, ULONG());
    MOCK_METHOD2(QueryInterface, HRESULT(IID, void**));
    MOCK_METHOD3(SetFieldString, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, LPCWSTR str));
    MOCK_METHOD4(SetFieldCheckbox, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, BOOL selected, LPCWSTR str));
    MOCK_METHOD3(SetFieldBitmap, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, HBITMAP bitmap));
    MOCK_METHOD3(SetFieldComboBoxSelectedItem, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, DWORD value));
    MOCK_METHOD3(DeleteFieldComboBoxItem, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, DWORD value));
    MOCK_METHOD3(AppendFieldComboBoxItem, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, LPCWSTR str));
    MOCK_METHOD3(SetFieldSubmitButton, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, DWORD value));
    MOCK_METHOD1(OnCreatingWindow, HRESULT(HWND));
    MOCK_METHOD3(SetFieldState, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, CREDENTIAL_PROVIDER_FIELD_STATE cpfs));
    MOCK_METHOD3(SetFieldInactiveState, HRESULT(ICredentialProviderCredential creds, DWORD dwFieldID, CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis));
};

class MockCredential : public ICredentialProviderCredential
{
    MOCK_METHOD0(Release, ULONG());
    MOCK_METHOD0(AddRef, ULONG());
    MOCK_METHOD2(QueryInterface, HRESULT(IID iid, void** object));
    MOCK_METHOD1(Advise, HRESULT(ICredentialProviderCredentialEvents events));
    MOCK_METHOD0(UnAdvise, HRESULT());
    MOCK_METHOD1(SetSelected, HRESULT(BOOL selected));
    MOCK_METHOD0(SetDeselected, HRESULT());
    MOCK_METHOD3(GetFieldState, HRESULT(DWORD dwFieldID, CREDENTIAL_PROVIDER_FIELD_STATE cpfs, CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis));
    MOCK_METHOD2(GetStringValue, HRESULT(DWORD dwFieldID, PWSTR str));
    MOCK_METHOD2(GetBitmapValue, HRESULT(DWORD dwFieldID, HBITMAP bitmap));
    MOCK_METHOD3(GetCheckboxValue, HRESULT(DWORD dwFieldID, BOOL selected, PWSTR str));
    MOCK_METHOD3(GetComboBoxValueCount, HRESULT(DWORD dwFieldID, DWORD val1, DWORD val2));
    MOCK_METHOD3(GetComboBoxValueAt, HRESULT(DWORD dwFieldID, DWORD, PWSTR str));
    MOCK_METHOD2(GetSubmitButtonValue, HRESULT(DWORD dwFieldID, DWORD adjacent));
    MOCK_METHOD2(SetStringValue, HRESULT(DWORD dwFieldID, PCWSTR str));
    MOCK_METHOD2(SetCheckboxValue, HRESULT(DWORD dwFieldID, BOOL selected));
    MOCK_METHOD2(SetComboBoxSelectedValue, HRESULT(DWORD dwFieldID, DWORD value));
    MOCK_METHOD1(CommandLinkClicked, HRESULT(DWORD dwFieldID));
    MOCK_METHOD4(GetSerialization, HRESULT(CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE cpgsr, CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION cpcs, PWSTR str, CREDENTIAL_PROVIDER_STATUS_ICON icon));
    MOCK_METHOD4(ReportResult, HRESULT(NTSTATUS status, NTSTATUS substatus, PWSTR pwstr, CREDENTIAL_PROVIDER_STATUS_ICON icon));
};

The problem is that all the MOCK_METHODx-calls that have the other interface as parameter trigger this error:

Error: object of abstract class type "*** " is not allowed.

What can I do to avoid this error?

Jarod42
  • 203,559
  • 14
  • 181
  • 302
Frank
  • 2,036
  • 1
  • 20
  • 32
  • 1
    `HRESULT(ICredentialProviderCredentialEvents events)` should probably be `HRESULT(ICredentialProviderCredentialEvents& events)`, else you have slicing. – Jarod42 Jan 26 '17 at 12:32
  • OMG, I feel so stupid now. :-( Please add your comment as an answer, I will gladly accept it. – Frank Jan 26 '17 at 12:45
  • I think one of `ICredentialProviderCredential` in your question is suppose to be `ICredentialProviderCredentialEvents`. If that is so, please fix it so it's not confusing for reader. – Anže Jan 26 '17 at 12:47
  • Thanks for advice. I corrected it. – Frank Jan 26 '17 at 12:53

0 Answers0