2017-03-10 3 views
2

Mit Google Test möchte ich überprüfen, dass einige Klassenmethoden aufgerufen werden, wenn ich eine andere Klassenmethode aufrufen.Überprüfen Sie den Aufruf von Klassenmethoden mit Google Test

#include "gtest/gtest.h" 

class Foo { 

    void DoWorkPrivate(int i) {} 

public: 

    void DoWork(int i) {} 

    void Run() { 
     for (int i = 1; i <= 5; i++) { 
      DoWork(i); 
      DoWorkPrivate(i); 
     } 
    } 
}; 

TEST(FooTest, Run) { 
    Foo foo;  
    foo.Run(); // Need to check that DoWork() and DoWorkPrivate() are invoked 
} 

Frage:

Wie um zu überprüfen, dass DoWork() und DoWorkPrivate() 5mal mit bestimmten Parametern aufgerufen werden (1, 2, 3, 4, 5)?

Antwort

2

Der normale Weg ist in diesem Fall, ein Mock-Objekt zu erstellen. Es gibt viele Literatur und Artikel über Spott und die verschiedenen Arten von Mocks. Also werde ich hier nicht ins Detail gehen. z.B. fowler about mocking.

Aber im Allgemeinen können Sie die Klasse (oder normalerweise die Schnittstelle der Klasse) unterklassifizieren, erwarten Sie den Methodenaufruf.

, die für Ihr Beispiel bedeutet:

class FooMock : public Foo { 
    public: 
    bool isDoWorkPrivateCalled() { 
    return isDoWorkPrivatecall; 
    } 

    private: 
    DoWorkPrivate(int i) { isDoWorkPrivatecall = true;} 
    bool isDoWorkPrivatecall = false; 
} 


TEST(FooTest, Run) { 
    Foo *foo = new FooMocK();  
    foo->Run(); 
    EXPECT_TRUE(foo->isDoWorkPrivateCalled()); 
} 

Und ja, das bedeutet, dass die privaten Methoden geschützt werden muss.

Zumindest schlage ich vor, gmock zu verwenden. Das Mocking-Framework erweitert gtest um die Mock-Features. Mit gmock Sie eine Methode

MOCK_METHOD1(DoWorkPrivate, void(int i)); 

Dann in Ihrem speziellen Fall verspotten könnte, würde der Test wie folgt aussehen:

EXPECT_CALL(foo, DoWorkPrivate(1)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(2)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(3)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(4)).Times(1); 
EXPECT_CALL(foo, DoWorkPrivate(5)).Times(1); 
+1

meine Modifikation der Code am Ende ist die wirkliche Antwort auf die Frage;) –

+0

Ja ok. Ich dachte, meine ursprüngliche Antwort war leicht auf seine spezifische Frage zu übertragen. ;-) – Soeren

0

Wie überprüft man, dass DoWork() und DoWorkPrivate() 5 mal mit bestimmten Parametern (1, 2, 3, 4, 5) aufgerufen werden?

kann ich denke an die folgenden:

  1. eine Nebenwirkung einführen. Lassen Sie sie den Wert der globalen Variable erhöhen, oder lassen Sie sie etwas in eine Datei schreiben. Sie können messen, wie oft sie aufgerufen wurden, indem Sie die Nebenwirkungen verfolgen.

  2. Lassen Sie sie den Wert einer Variablen erhöhen, die Sie an die Funktionen übergeben. Sie können messen, wie oft sie aufgerufen wurden, indem Sie die Änderungen an den Variablen verfolgen, die Sie an sie übergeben haben.

PS Es gibt vielleicht andere Mechanismen, die ich nicht bewusst bin.

Verwandte Themen