2016-10-11 1 views
1

Я пытаюсь издеваться над абстрактным классом, но продолжаю собирать ошибки изнутри заголовков GMock. Я не могу поделиться фактическим кодом, но почти такой же, как ниже. Мышление работало нормально, но мне пришлось изменить функцию «DoStuff», чтобы взять объект, но ссылку. С тех пор он не компилируется. Ошибка - это что-то вроде: * GMock не может сравнивать «Элемент» с длинным *.GMock не компилируется, виртуальная функция с аргументом ссылки на тип пользователя

"C++ code" 

using ::testing::NiceMock; 

class Element{}; 

class Foo 
{ 
    public: 
     virtual void DoStuff(Element&) = 0; 
}; 

class MockFoo : public Foo 
{ 
    public: 
     MockFoo() {}; 
     MOCK_METHOD1(DoStuff, void(Element&)); 

}; 

TEST(example, test) 
{ 
    NiceMock<MockFoo> mf; 
    Element element{}; 
    EXPECT_CALL(mf, DoStuff(element)).Times(1); 

    mf.DoStuff(element); 
} 

ответ

1

Посмотрите на generic comparisons matchers.

Если вы хотите проверить, точно такой же элемент передается через mf.DoStuff к вашему издевались объекта - использовать ::testing::Ref Искателя:

EXPECT_CALL(mf, DoStuff(Ref(element))); 

(Примечание: что времена (1) по умолчанию - так на самом деле не нужно).

Если вы хотите проверить, если передаваемые объекты имеют точно такое же значение - определить оператор сравнения для него - или использовать некоторые надлежащий Искатель - как ::testing::Property - как:

EXPECT_CALL(mf, DoStuff(AllOf(Property(&Example::getX, expectedXValue), 
           Property(&Example::getY, expectedYValue)))); 

я думаю ваши точные проблемы, потому что ваши фактический Example класс является абстрактным и/или не имеет operator == - так что по умолчанию совпадение ::testing::Eq не может быть использовано.

+0

Спасибо за быстрый ответ, мне не нужен точный «элемент», мне нужно проверить, вызвана ли функция. Но снова спасибо, я собираюсь попробовать ваши предложения. –

+1

Вы можете использовать любой matcher 'testing :: _', если это все, что вам нужно. EXPECT_CALL (mf, DoStuff (_)); ' – PiotrNycz

+0

Спасибо, что еще лучше! –