2013-02-13 11 views
12

Google Mockの使用を開始しようとしているときに問題が発生しました。何らかの理由で、タイプが一貫していても、私がEXPECT_CALLマクロで指定している呼び出しを知ることができません。なぜ最初の関数と一致しないのか、それを最初の関数と一致させるために追加/追加する必要があるのか​​を知りたい。Google Mockがこの関数呼び出しをあいまいにしているのはなぜですか?

モッククラス:

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

エラーをスローテストコード:

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

コンパイルエラー:

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

答えて

21

、Googleのモックを使用するオーバーロードのトラブル占いを持っています。 cookbookからは、正確な型を指定するMatcher<T>またはTypedEq<T>マッチャーを使用してみてください:完全に働いた(二重そうリンク用)

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

おかげで、。 – dlanod

+0

詳細については、https://github.com/google/googlemock/blob/master/googlemock/docs/CookBook.md#using-matchers – parasrish

+0

'using :: testing :: Matcher;を参照してください。上記のように使用してください。完璧に動作します! – parasrish

関連する問題