2017-11-13 1 views
-2

Angenommen, wir haben eine Cat-Klasse. Je nach Parametern Energie wird eine show_cat Funktion aufgerufen:Wie zu testen, ob die richtige Methode von Methode der gleichen Klasse aufgerufen wird C++ gmock

class Cat{ 

public: 

    int energy; 

    virtual void show_cat() 
    { 
     if(energy < 10) 
     { 
      show_tired_cat(); 
     } 
     else 
     { 
      show_energized_cat(); 
     } 
    } 

    virtual void show_tired_cat(){} 
    virtual void show_energized_cat(){} 
}; 

Wie können wir testen, ob die richtige Show-Funktion gmock genannt wird?

Das folgende ist natürlich falsch, aber es gibt Ihnen eine Struktur für das Geben Sie mit spielen können:

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

class MockCat: public Cat 
{ 
public: 
    MOCK_METHOD0(show_tired_cat,void()); 
    MOCK_METHOD0(show_energized_cat,void()); 
}; 

TEST (catTest, show_cat){ 

    //This is of course not working 
    Cat realCat; 
    realCat.energy = 3; 
    realCat.show_cat(); 

    MockCat fakeCat; 
    EXPECT_CALL(fakeCat,show_tired_cat()).Times(1); 
    EXPECT_CALL(fakeCat,show_energized_cat()).Times(0); 
} 

int main(int argc, char *argv[]) 
{ 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

Wenn Sie unten auf die Frage abstimmen, dann bitte kommentieren, warum Sie dies tun, so dass ich kann verbessern.

+0

Sollte 'fake.show_cat()' nach dem Einrichten der Erwartungen nicht aufgerufen werden? – user0042

+0

Auch der Aufruf von 'fakeCat.show_cat();' nach dem Einrichten der Erwartung ändert nichts, weil es wieder die 'show_cat-Methode' von 'realCat' aufrufen wird, was die 'show_tired_cat'-Methode von' realCat' aufrufen wird. – newandlost

Antwort

0

Ich denke, Sie könnten Methoden manuell verspotten und einen Zähler in Ihrer MockCat-Klasse überprüfen. Für die Ex:

class MockCat: public Cat 
{ 
public: 
    int tiredCount; 
    int energizedCount; 
public: 
    void show_tired_cat() { 
     tiredCount++; 
     Cat::show_tired_cat(); 
    } 

    void show_energized_cat() { 
     energizedCount++; 
     Cat::show_energized_cat(); 
    } 
}; 

TEST (catTest, show_cat){ 
    MockCat fakeCat; 
    fakeCat.energy = 3; 
    fakeCat.tiredCount = 0; 
    fakeCat.energizedCount = 0; 
    fakeCat.show_cat(); 
    ASSERT_EQ(fakeCat.tiredCount, 1); 
    ASSERT_EQ(fakeCat.energizedCount, 0); 

} 

Hoffe, dass es nützlich sein wird, wenn dieser Code gmock nicht direkt verwenden.

Verwandte Themen