2013-02-13 21 views
12

Ho riscontrato un problema durante il tentativo di iniziare a utilizzare Google Mock: per qualche motivo non è in grado di dire la chiamata che sto specificando nella macro EXPECT_CALL, anche se i tipi sono coerenti. Voglio sapere perché non si abbina solo alla prima funzione, e cosa devo fare/aggiungere per farlo corrispondere alla prima funzione.Perché Google Mock trova questa funzione ambigua?

La classe finto:

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

Il codice di prova che genera l'errore:

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

L'errore di compilazione:

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

risposta

21

Google finto ha dire problemi che sovraccarico da usare . Dal cookbook, provare a utilizzare i Matcher<T> o TypedEq<T> matchers per specificare il tipo esatto:

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

Grazie (doppiamente così per il link), che ha funzionato perfettamente. – dlanod

+0

per ulteriori informazioni su questo, è possibile fare riferimento a: https://github.com/google/googlemock/blob/master/googlemock/docs/CookBook.md#using-matchers – parasrish

+0

'using :: testing :: Matcher;' e quindi usando come suggerito sopra. funziona perfettamente! – parasrish

Problemi correlati