Frage zu Test mit Googlemock



  • Hallo,
    ich habe mal eine Frage zu Googlemock. Source-Code: https://github.com/ttt15/a/tree/master/A. Die sln-Datei ist eine Ebene höher.
    Ich habe eine Rechner- und eine Hilfsrechner-Klasse. Die Rechner-Klasse hat die Methoden sum und sum_zeiger. Beide greifen auf hilfsum der Klasse Hilfrechner(im Ordner foo) zu. sum_zeiger verwendet einen Zeiger der Klasse Hilfrechner, um auf hilfsum zuzugreifen. sum verwendet eine normale Variable. Jetzt möchte ich Hilfsrechner mocken und sicher gehen, dass hilfsum in sum und sum_zeiger exakt einmal aufgerufen wird. Die Tests sind in MainA.cpp.
    TestmitZeiger funktioniert. Da wird richtig gemockt und der Test ist grün. Bei TestOhneZeiger funktioniert es nicht.
    Kann mir jemand sagen, was ich bei TestOhneZeiger machen muss, damit er auch grün wird?



  • Ich für meinen Teil hab keine Lust zu versuchen mir aus deiner Beschreibung jetzt den Code zu rekonstruieren den du eventuell haben könntest, und auf der Basis dann zu raten wie deine Tests aussehen könnten - und was du dabei evtl. falsch machen könntest.

    Also zeig den Code her, oder warte ob sich jemand findet der mehr Geduld mit solchem Unsinn hat.



  • Ich habe tatsächlich den Test Code gefunden.... Wobei es eigentlich eine ziemliche Zumutung ist, den fraglichen Code nicht direkt hier zu posten...

    Wenn der Test fehlschlägt, aber der richtig geschrieben ist (was ich nicht geprüft habe), dann ist der Code under Test kaputt.

    Du hast ein Expect und ein Assert in deinem Testfall. Was davon schlägt fehl?
    Sonst ist, auch wenn ein Testfall nicht funktioniert, der Debugger der beste Freund des Programmierers.



  • Entschuldigung. Das war nicht meine Absicht.
    Das ist der relevante Code:

    #include "gmock/gmock.h";
    #include "gtest/gtest.h";
    
    using ::testing::Return;
    using ::testing::AtLeast;
    using ::testing::Exactly;
    using ::testing::_;
    
    class Rechner
    {
    	int sum_zeiger(int a, int b)
    	{
    		return a + b + hilfe_zeiger->hilfsum();
    	}
    
    	int sum(int a, int b)
    	{
    		return a + b + hilfe.hilfsum();
    	}
    	//Konstruktor - Dependeny Injection
    	Rechner(Hilfsrechner* h)
    	{
    		hilfe_zeiger = h;
    	}
    
    	//Konstruktor - Dependeny Injection
    	Rechner(Hilfsrechner h)
    	{
    		hilfe = h;
    	}
    	
    }
    
    class Hilfrechner
    {
    	public:
    
    	int hilfsum()
    	{
    		return 1;
    	}
    }
    
    class MockHilfsrechner:public Hilfsrechner 
    {
    public:
    	MOCK_METHOD(int, hilfsum, ());
    };
    
    
    TEST(MeinTest, TestMitZeiger)
    {
    	MockHilfsrechner h;
    	Rechner r(&h);
    
    	EXPECT_CALL(h, hilfsum()).Times(Exactly(1)).WillOnce(Return(100));
    	int result = r.sum_zeiger(1, 2);
    	ASSERT_EQ(103, result);
    
    }
    
    //Fällt durch, weil nicht gemockt wird
    TEST(MeinTest, TestOhneZeiger)
    {
    	MockHilfsrechner h;
    	Rechner r(h);
    
    	EXPECT_CALL(h, hilfsum()).Times(Exactly(1)).WillOnce(Return(100));
    	int result = r.sum(1, 2);
    	ASSERT_EQ(103, result);
    
    }
    
    


  • Ist dir nicht klar, was bei Rechner r(h); passiert, wenn du MockHilfsrechner h als Wert übergibst?

    Verwende am besten eine Referenz.

    PS: Außerdem sollten die zu mockenden Methoden virtual in deiner Klasse sein.
    Ansonsten s. Mocking Non-virtual Methods (der Seiten-Anker scheint nicht zu funktionieren, daher scrolle ein bißchen nach unten).



  • @Th69 Vielen Dank. Das ist die Sache mit Polymorphismus. Referenzen oder Zeiger.



  • @asd1 Ne, dass ist die Sache mit Kopie oder gleiches Objekt 😉


Anmelden zum Antworten