2015-12-29 251 views
2

我需要計算構造函數(默認/複製/移動)和析構函數被調用的次數。我使用gmock。我如何檢查它?如何使用gmock模擬構造函數和析構函數

編輯:感謝馬可波波維奇的建議,我會解釋說我現在有。我有這樣的課,我想用gmock來嘲笑它。我怎樣才能做到這一點?

class A 
{ 
public: 
    static int m_calls_to_cons; 

public: 
    A() { m_calls_to_cons++; } 
}; 

int A::m_calls_to_cons; 

我使用這個類來檢查我的容器的行爲。

+0

將是不錯的有負或接近票數一些解釋。謝謝。 – Yola

+1

沒有downvote,但我很確定它與它只有兩個句子的事實有關,它不清楚你到底想要什麼。 gmock與計數ctor/dtor呼叫有什麼關係?請給出更多的上下文,以便我們更好地理解。 –

+0

這不是一件容易的事情,真的取決於你的用例。我的意思是,您需要使用一些「解決方法」來進行此計數 - 但您可以使用哪種解決方法取決於您的使用情況。請指定那些對象 - 本地,從工廠創建,注入什麼? – PiotrNycz

回答

1

首先,您必須指定您需要的。要做到這一點的方式是通過定義接口類:

class SpecialFunctionsNotifier 
{ 
public: 
    virtual ~SpecialFunctionsNotifier() {} 

    virtual void construct() = 0; 
    virtual void destruct() = 0; 
    virtual void copyConstruct() = 0; 
    virtual void copyAssign() = 0; 
}; 

所以,你可以讓「默認」空(意思是空的)對象FPGA實現:

class SpecialFunctionsNullNotifier : public SpecialFunctionsNotifier 
{ 
public: 
    virtual void construct() override {} 
    virtual void destruct() override {} 
    virtual void copyConstruct() override {} 
    virtual void copyAssign() override {} 
}; 

而且,有A利用它:

class A 
{ 
public: 
    static SpecialFunctionsNullNotifier m_calls_to_cons_default; 
    static SpecialFunctionsNotifier* m_calls_to_cons; 

public: 
    A() { m_calls_to_cons->construct(); } 
}; 

SpecialFunctionsNullNotifier A::m_calls_to_cons_default; 
SpecialFunctionsNotifier* A::m_calls_to_cons = &A::m_calls_to_cons_default; 

然後,嘲諷這是通知簡單的任務:

class SpecialFunctionsNotifierMock : public SpecialFunctionsNotifier 
{ 
public: 
    MOCK_METHOD0(construct, void()); 
    // .. 
}; 

而且在測試中,以這種方式使用:

TEST(ACase, AConstructCount) 
{ 

    SpecialFunctionsNotifierMock callToConsMock; 
    A::m_calls_to_cons = &callToConsMock; 
    EXPECT_CALL(callToConsMock, construct()).Times(100); 
    A a[100]; 
    // remember to cleanup 
    A::m_calls_to_cons = &A::m_calls_to_cons_default; 
} 
+0

+1。這是個不錯的訣竅,但很難讓代碼變得可讀,而不僅僅是將A :: m_calls_to_cons與一些數字進行比較。可能現在我不會嘲笑這個班。 – Yola

+0

也可以使虛擬析構函數受到保護,因爲您從不刪除指針到基類。 – Yola

+0

@Yola - 關於虛擬析構函數的保護。無論它是否會根據當前使用情況進行編譯,將類粘貼到當前使用情況並不是一個好習慣,從而防止在其他用例中使用它。 – PiotrNycz

相關問題