#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. Спасибо, это еще лучше!