GMock не компилируется, виртуальная функция со ссылочным аргументом пользовательского типа

#c #reference #virtual #googlemock #gmock

#c #ссылка #виртуальная #googlemock

Вопрос:

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

 "C   code"

using ::testing::NiceMock;

class Element{};

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

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

};

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

   mf.DoStuff(element);
}
  

Ответ №1:

Посмотрите на общие сопоставители сравнений.

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

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

(Обратите внимание: значение Times(1) по умолчанию — поэтому в этом нет необходимости).

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

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

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

Комментарии:

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

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

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