2013-02-13 11 views
12

Ich habe ein Problem beim Versuch, Google Mocks zu verwenden, kennengelernt - aus irgendeinem Grund kann es den Aufruf, den ich im Makro anrufe, nicht angeben, obwohl die Typen konsistent sind. Ich möchte wissen, warum es nicht nur der ersten Funktion entspricht, und was ich tun/hinzufügen muss, damit es mit der ersten Funktion übereinstimmt.Warum findet Google Mocks diesen Funktionsaufruf mehrdeutig?

Die mock Klasse:

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)); 
} 

Der Code-Test, der den Fehler wirft:

__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)); 

Der Übersetzungsfehler:

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

Antwort

21

Google Mock, Schwierigkeiten hat, die Verwendung zu überlasten . Vom cookbook, versuchen Sie den Matcher<T> oder TypedEq<T> Matcher mit dem genauen Typ angeben:

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); 
} 
+1

Dank (doppelt so für den Link), die perfekt gearbeitet. – dlanod

+0

Weitere Informationen hierzu finden Sie unter: https://github.com/google/googlemock/blob/master/googlemock/docs/CookBook.md#using-matchers – parasrish

+0

'using :: testing :: Matcher;' und dann wie oben beschrieben verwenden. funktioniert perfekt ! – parasrish