2016-07-07 18 views
2

Ich habe eine Scheinfunktion:GoogleTest wie InvokeArgument verwenden Mit WithArg

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

Ich möchte 2. aufzurufen (0-basiert) Argument von oben Funktion mit dem dritten Argument als Parameter, das heißt, rufen „cb“ Funktion mit "p1" als Parameter. Wie kann ich das machen?

Ich kann „cb“ mit einigen benutzerdefinierten Wert aufrufen InvokeArgument mit:

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

Aber ich will es mit einem tatsächlichen Parameter auf denselben verspottet Funktionsaufruf übergeben aufzurufen.

Antwort

1

Da DoAll Aktionen in Folge verarbeitet, können Sie den dritten Argumentwert in einer externen Variablen speichern und dann das zweite Argument mit dieser Variablen als Parameter aufrufen.

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

können Sie einen ACTION definieren Ihr Rückruf aufzurufen. So etwas wie unten:

ACTION(CallCb) { 
    arg2(arg3); 
} 

... 

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

Leider kombiniert WithArg und InvokeArgument funktioniert nicht. Sie können jedoch Invoke verwenden und die Callback-Funktion zur verspottet Methode übergeben lassen. Etwas wie folgt aus:

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