2016-07-07 5 views
2

J'ai une fonction maquette:GoogleTest comment utiliser InvokeArgument Avec WithArg

MOCK_METHOD4(my_func, int(double, double, void* (*cb) (int), int p1)); 

Je veux invoquer 2ème argument de la fonction ci-dessus (base 0) avec le 3ème argument comme paramètre, à savoir, invoquer « cb » fonctionne avec "p1" comme paramètre. Comment puis je faire ça?

Je peux invoquer « cb » avec une valeur personnalisée à l'aide InvokeArgument:

ON_CALL(mockObj, my_func(_, _, _, _)). 
       WillByDefault(DoAll(
         IgnoreResult(InvokeArgument<2>(10)), 
         Return(0))); 

Mais je veux l'appeler avec un paramètre réel passé au même appel de fonction moqué.

Répondre

1

Étant donné que DoAll traite les actions en séquence, vous pouvez enregistrer la valeur du 3ème argument dans une variable externe, puis appeler le 2ème argument avec cette variable en tant que paramètre.

int p; 
ON_CALL(mockObj, my_func(_, _, _, _)). 
      WillByDefault(DoAll(
        SaveArg<3>(&p), 
        IgnoreResult(InvokeArgument<2>(p)), 
        Return(0))); 
1

Vous pouvez définir un ACTION pour appeler votre rappel. Quelque chose comme ci-dessous:

ACTION(CallCb) { 
    arg2(arg3); 
} 

... 

ON_CALL(*mockObj, my_func(_, _, _, _)) 
    .WillByDefault(
    DoAll(CallCb(), 
      Return(0))); 
0

Malheureusement, la combinaison WithArg et InvokeArgument ne fonctionne pas. Cependant, vous pouvez utiliser Invoke et faire correspondre la fonction de rappel passée à la méthode simulée. Quelque chose comme ceci:

EXPECT_CALL(*m_pInstallManagerMock, my_func(_, _, my_callback, _)). 
      WillOnce(DoAll(
        WithArg<3>(IgnoreResult(Invoke(my_callback))), 
        Return(0)));