对于gtest,如何模拟名称相同但类型不同的方法

时间:2019-09-04 13:33:00

标签: c++ mocking googletest

我使用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。

1 个答案:

答案 0 :(得分:3)

您可以使用键入的通配符(documentation):

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上编译,但稍后在 linking 阶段失败-不确定如何在那里链接GMock。


旁注:您不必通过Return()方法来void