Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Google Mocks find this function call ambiguous?

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)'
like image 246
dlanod Avatar asked Feb 13 '13 00:02

dlanod


People also ask

What is expect call in Gmock?

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) .

What is Expect_call?

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).

What is Gmock?

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.


2 Answers

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::_)));
like image 35
Muschel Avatar answered Oct 20 '22 20:10

Muschel


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);
}
like image 102
congusbongus Avatar answered Oct 20 '22 20:10

congusbongus