2017-09-07 2 views
1

Ich habe eine Klasse, die einen Zeiger auf eine andere Klasse akzeptiert und hat eine Methode read():GMOCK - wie die Methodenargumente ändern, wenn Rückgabetyp ungültig ist

class B: 
{ 
public: 
...... 
void read(char * str); 
...... 
}; 

class A 
{ 
public: 
A(B *bobj):b(bobj); 
B* b; 
void read (char * str); 
.......... 
}; 

ich das Objekt wie unter

aufrufen
A * aobj = new A(new B()); 

Nun sollte ich in der Lage sein, sowohl Leseverfahren der wie unter Klassen zuzugreifen:

char text[100]; 
b->read(text) 
aobj->read(text) 

Verfahren r ead der Klasse A und B ist codiert, um einige Werte wie bereitgestellt in das Eingabearray zu kopieren.

Wie kann ich MOCK-Methode der Funktion schreiben, um das Argument auf einen bestimmten Wert zu ändern?

Gibt mir ein Kompilierungsproblem als gelesene Methode kann einen Wert per Definition nicht zurückgeben?

Antwort

1

Ich habe Invoke-Funktion verwendet, um dies zu erreichen. Hier ist ein Beispielcode.

Wenn Sie> = C++ 11 verwenden, können Sie der Invoke-Funktion einfach ein Lambda zuweisen.

#include <gtest/gtest.h>                                                
#include <gmock/gmock.h> 

using ::testing::Mock; 
using ::testing::_; 
using ::testing::Invoke; 

class actual_reader 
{ 
    public: 
    virtual void read(char* data) 
    { 
     std::cout << "This should not be called" << std::endl; 
    } 
}; 
void mock_read_function(char* str) 
{ 
    strcpy(str, "Mocked text"); 
} 

class class_under_test 
{ 
    public: 
     void read(actual_reader* obj, char *str) 
     { 
     obj->read(str); 
     } 
}; 

class mock_reader : public actual_reader 
{ 
    public: 
    MOCK_METHOD1(read, void(char* str)); 
}; 


TEST(test_class_under_test, test_read) 
{ 
    char text[100]; 

    mock_reader mock_obj; 
    class_under_test cut; 

    EXPECT_CALL(mock_obj, read(_)).WillOnce(Invoke(mock_read_function)); 
    cut.read(&mock_obj, text); 
    std::cout << "Output : " << text << std::endl; 

    // Lambda example 
    EXPECT_CALL(mock_obj, read(_)).WillOnce(Invoke(
      [=](char* str){ 
       strcpy(str, "Mocked text(lambda)"); 
      })); 
    cut.read(&mock_obj, text); 
    std::cout << "Output : " << text << std::endl; 



} 
+0

Danke - Sie bitte Lambda-Funktion zur Verfügung stellen, da ich bin mit C++ 11 – Prakash

+0

sollte einfach sein, werde ich es –

+0

Dank hinzufügen - ist es auch möglich, ein Benutzer Argument tatsächlich zusammen mit einem trotzte passieren - etwas like - Invoke (mock_read_function (_, "Dies ist ein Test")) wobei _ das eigentliche Argument ist, und das nächste ist benutzerdefiniert mit könnte int, array etc sein. In diesem Fall ist es ein String – Prakash

Verwandte Themen