2015-01-15 10 views
6

私はモックメソッドを持っています。それが呼び出されると、通常の動作を呼び出す前に別の関数を呼び出すようにしたいと思います。ような何か:Google C++ Mocking Framework(Google Mock)(V1.5)

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     Invoke(my_obj, &SomeAdditionalMethodIWantToCall), 
     Invoke(my_obj, &DefaultBehavior), 
     )); 

唯一の問題は、SomeAdditionalMethodIWantToCallが全くMockedMethodに提供するものに関連していないパラメータを期待していることです。私はそれらを与えることができるようにしたいが、私は構文に苦しんでいる。

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     Invoke(my_obj, &SomeAdditionalMethodIWantToCall, arg1, arg2, arg3), 
     Invoke(my_obj, &DefaultBehavior), 
     )); 

私はドキュメントでそのようなことを何も成功していないと思っています。 Using a Function or a Functor as an Action

は、我々は持っている:

  • Invoke(f)Invoke(object_pointer, &class::method)InvokeWithoutArgs(f)、ちょうど前方(またはしない)嘲笑機能を提供パラメータは、それが呼び出されますInvokeWithoutArgs(object_pointer, &class::method)

  • InvokeArgument<N>(arg1, arg2, ..., argk)はパラメータの1つを呼び出すためのようです。 Composite Actions

    • WithArg<N>(a)WithArgs<N1, N2, ..., Nk>(a)

    転送取得元の関数からどのパラメータを選択するのであるように見えます。

私はかなり明白なものを紛失していると思いますが、私はここに少しばかりいるので、どんな提案も役に立ちます。

答えて

5

可能なオプションの1つは、Assignアクションを使用して引数の値をクラス変数に保存し、次にヘルパーを使用して他の関数を呼び出すことです。以下の期待を使用します。

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     Assign(&classVariable1, arg1), 
     Assign(&classVariable2, arg2), 
     Assign(&classVariable3, arg3), 
     InvokeWithoutArgs(my_obj, &MyClass::SomeAdditionalMethodIWantToCallHelper), 
     Invoke(my_obj, &MyClass::DefaultBehavior), 
     )); 

そして、次のようにヘルパー関数を定義します。

void MyClass::SomeAdditionalMethodIWantToCallHelper() 
{ 
    SomeAdditionalMethodIWantToCall(classVariable1, classVariable2, classVariable3); 
} 

編集

別の可能な選択肢は、Aへのポインタになりますカスタムアクションを書くことですメンバ関数とそれに渡す引数を指定します。これは、もともと構文のために求めていたものに近いものです。ここではカスタムアクションは次のとおりです。

ACTION_P5(InvokeUnrelatedFunction, classPointer, pointerToMemberFunc, 
      first, second, third) 
{ 
    (classPointer->*pointerToMemberFunc)(first, second, third); 
} 

は、ここであなたが期待して、それを使用する方法は次のとおりです。

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     InvokeUnrelatedFunction(my_obj, &MyClass::SomeAdditionalMethodIWantToCall, 
           arg1, arg2, arg3), 
     Invoke(my_obj, &MyClass::DefaultBehavior), 
     )); 
+0

'InvokeUnrelatedFunction'アクションでは、' arg1'がアクションを呼び出そうとしているところで宣言されていないというコンパイラエラーが発生します。何が原因だろうか? – Martin

+0

@Martin質問で述べたように、 'arg1'は' 'MockedMethod'に提供されたものとまったく関係のないパラメータです。" 'MockedMethod'の引数を関数に渡したいのであれば、' Invoke'だけ使うことができます。また、 'Invoke'と' WithArgs'を組み合わせることもできます。例については、Google Mock Cookbookを参照してください。 –

3

あなたが++、11 Cを使用している場合、あなたはこのようなラムダ関数を使用することができます。

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
.WillOnce(DoAll(
    InvokeWithoutArgs([&]() { 
     my_obj->SomeAdditionalMethodIWantToCall(arg1, arg2, arg3); 
    }, 
    Invoke(my_obj, &DefaultBehavior) 
)); 
+0

非常にエレガント!ありがとう。 –