I've run into an issue while attempting to start using Google Mocks - for some reason it can't tell the call I'm specifying in the EXPECT_CALL
macro, even though the types are consistent. I want to know why it doesn't just match the first function, and what I need to do/add to make it match the first function.
The mock class:
class GMockTest : public ITest
{
public:
MOCK_METHOD2(SetParameter,
int(int nParameter, double value));
MOCK_METHOD2(SetParameter,
int(int nParameter, int value));
MOCK_METHOD2(SetParameter,
int(int nParameter, __int64 value));
}
The test code that throws the error:
__int64 nFrom = 0,
nTo = 0;
EXPECT_CALL(mock, SetParameter(2, nFrom))
.Times(1)
.WillOnce(Return(0));
EXPECT_CALL(mock, SetParameter(3, nTo))
.Times(1)
.WillOnce(Return(0));
The compilation error:
test.cpp(1343) : error C2668: GMockTest::gmock_SetParameter' : ambiguous call to overloaded function
testmocks.h(592): could be 'testing::internal::MockSpec<F>
&GMockTest::gmock_SetParameter(const testing::Matcher<T> &,const testing::Matcher<A2> &)
'
with
[
F=int (int,__int64),
T=int,
A2=__int64
]
testmocks.h(590): or 'testing::internal::MockSpec<F>
&GMockTest::gmock_SetParameter(const testing::Matcher<T> &,const testing::Matcher<T> &)'
with
[
F=int (int,int),
T=int
]
testmocks.h(580): or 'testing::internal::MockSpec<F>
&GMockTest::gmock_SetParameter(const testing::Matcher<T> &,const testing::Matcher<FloatT
ype> &)'
with
[
F=int (int,double),
T=int,
FloatType=double
]
while trying to match the argument list '(int, __int64)'
In gMock we use the EXPECT_CALL() macro to set an expectation on a mock method. The general syntax is: EXPECT_CALL(mock_object, method(matchers)) . Times(cardinality) .
EXPECT_CALL not only defines the behavior, but also sets an expectation that the method will be called with the given arguments, for the given number of times (and in the given order when you specify the order too).
Gmock is a mocking framework for the Groovy language. Gmock is all about simple syntax and readability of your tests so you spend less time learning the framework and more writing code. To use Gmock just drop the gmock jar file in your classpath. The current version is gmock-0.8.
For those of you who have the same issue but unlike the OP don't have or care about the input parameters, the other answer's solution using testing::Matcher can be combined with a wild card testing::_ this way:
EXPECT_CALL(mock, SetParameter(testing::_, Matcher<__int64>(testing::_)));
Google mock has trouble telling which overload to use. From the cookbook, try using the Matcher<T>
or TypedEq<T>
matchers to specify the exact type:
struct ITest
{
virtual int SetParameter(int n, double v) = 0;
virtual int SetParameter(int n, int v) = 0;
virtual int SetParameter(int n, __int64 v) = 0;
};
struct MockTest : public ITest
{
MOCK_METHOD2(SetParameter, int(int n, double v));
MOCK_METHOD2(SetParameter, int(int n, int v));
MOCK_METHOD2(SetParameter, int(int n, __int64 v));
};
TEST(Test, Test)
{
MockTest mock;
__int64 nFrom = 0, nTo = 0;
EXPECT_CALL(mock, SetParameter(2, Matcher<__int64>(nFrom)));
EXPECT_CALL(mock, SetParameter(3, Matcher<__int64>(nTo)));
mock.SetParameter(2, nFrom);
mock.SetParameter(3, nTo);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With