2014-12-04 52 views
4

我確實需要測試一個C++類的私有成員方法。可以通過在單元測試中定義我自己的PRIVATE宏來讓私有成員公開嗎?

由於它是私有方法,我不想將其更改爲protected,所以我無法通過創建子類和使用聲明添加來公開它。

所以,如果我定義一個宏PRIVATE來取代私人關鍵字。這是解決這個問題的好方法嗎?

#if __UNITTEST__ 
#define PRIVATE public 
#else 
#define PRIVATE private 
#endif 

class A { 
    PRIVATE: 
     void f(); 
}; 
+0

你在測試什麼?例如Qt提供了一個find_child方法,您可以使用它來訪問私有GUI元素。 – 2014-12-04 20:26:20

+0

我認爲應該沒問題......但你爲什麼要這樣做?這是一個奇怪的代碼。使用系統定義關鍵字。這對新來的人來說更難以接受。無論如何試試你的運氣,對我來說它應該工作得很好 – 2014-12-04 20:29:47

回答

5

使用宏來改變C++關鍵字的含義是一個非常糟糕的主意。它不僅會讓你的讀者感到困惑,而且它還會打開你的代碼,讓你的代碼中的善意用戶編譯時間濫用,只要定義一個預處理器符號,他們就可以讓你的類的私有成員可見。

單元測試私有成員函數的想法同樣有害,因爲你的單元測試會破壞你實現的封裝。

一個人應該只測試公共和受保護的成員。另一方面,私人成員應該通過調用公共和受保護的成員函數間接地進行測試,讓私人成員函數保持它們的實現細節。

如果您絕對必須測試私有函數(我強烈建議不要),您可以聲明您的單元測試類爲正在測試的類的friend,並授予其成員函數訪問所需類的私有成員函數的權限。

相關問題