Для gtest, как имитировать методы с одинаковым именем, но разными типами

avatar
Karl
4 сентября 2019 в 13:33
653
1
1

Я использую Gtest для проверки своего кода C++, и теперь я столкнулся с проблемой насмешек. По нескольким причинам у меня есть несколько методов с одинаковыми именами, но разными типами аргументов и реализацией, например

.
void foo(int& i);
void foo(double& d);
void foo(float& f);

Для них я делаю фиктивные методы, например

MOCK_METHOD1(foo, void(int&));
MOCK_METHOD1(foo, void(double&));
MOCK_METHOD1(foo, void(float&));

Однако я не мог использовать для них EXPECT_CALL. В тестовом коде я установил действие для foo(int), например

EXPECT_CALL(mock_object, foo(_)).WillOnce(DoAll(SetArgReferee<0>(10),Return()));

но компилятор не удался, потому что цель неоднозначна среди int, double и float.

Есть ли способ использовать EXPECT_CALL для фиктивного метода определенного типа?

Мне не удалось использовать testing::MatcherCast и testing::SafeMatcherCast, потому что они принимают только тип const. Однако мне нужно обновить аргумент, поэтому я не могу использовать const.

Источник
sklott
4 сентября 2019 в 14:08
0

Вы пробовали что-то вроде EXPECT_CALL(mock_object, foo(AnyOf(Eq(0),Ne(0))));? В противном случае, я думаю, вам нужно реализовать свой собственный сопоставитель...

Ответы (1)

avatar
Yksisarvinen
4 сентября 2019 в 16:11
4

Вы можете использовать типизированный подстановочный знак (документация):

EXPECT_CALL(mock_object, foo(An<int&>())).WillOnce(SetArgReferee<0>(10));
EXPECT_CALL(mock_object, foo(A<double&>())).WillOnce(SetArgReferee<0>(10.));

A<> и An<> означают одно и то же, у них два имени просто для удобства чтения. Смотрите онлайн на godbolt


Примечание: вам не нужно использовать метод Return() из void.

Karl
5 сентября 2019 в 10:17
0

Спасибо, Юксисарвинен. У меня работает без ошибок ссылок.