我有一個幾乎單值般類一樣的人:嘲笑靜態/全局函數的最簡單方法?
class Person
{
public:
Person(ThirdPartyClass *object);
virtual ~Person(void);
virtual std::string GetFullName() const;
virtual int GetAge() const;
virtual int GetNumberOfDaysTillBirthday() const;
};
我使用的是第三方庫和ThirdPartyClass
需要有一個名爲Destroy
(第三方庫的一部分)的全局/靜態函數呼籲它摧毀它。這個Destroy
函數在Person析構函數中被調用。
現在我試圖單元測試我的人類,我需要一種方法來模擬/存根Destroy
方法。我想我可以在靜態Destroy
函數中編寫一個包裝類,然後使用依賴注入將這個包裝注入到Person類中,但似乎只是在這個簡單的類上調用這個函數而已。什麼是簡單直接的方法來做到這一點?或者依賴注入真的是最好的方式嗎?
更新
最終,我決定去創造一類包裝的所有第三方庫的全局函數,然後使用依賴注入到這個類傳遞到我的個人類的構造函數。這樣我可以將Destroy方法留存。雖然person類只使用一個函數,但是庫中的其他函數在我的代碼中的其他位置被調用,並且因爲我需要測試那些我將面對同一問題的函數。
我在我的主應用程序代碼中創建了這個包裝類的單個實例,並在需要時注入它。我選擇走這條路,因爲我認爲它更清晰。我喜歡Billy ONeal的解決方案,我認爲它解決了我的問題,但是我意識到如果我將代碼保留幾個月,然後再回過頭來看看與依賴注入相比,發生什麼事情需要更長的時間。我想起了蟒蛇格言的禪意:「顯性比隱性更好」。我感覺依賴注入使得發生的事情更加明確。
剛剛創建靜態/全局函數作爲存根並調用它有什麼問題? – littleadv
@littleadv:嗯,我剛剛進入單元測試,但我的理解是你不想修改你正在測試的類來測試它。所以,如果我正確理解你,通過創建一個存根Destroy方法並在我的Person類中使用它,我正在更改我的人員類,然後我必須以某種方式在測試版本和生產版本之間切換。 – User
@用戶 - 不要修改您正在測試的類,而要將自己的'ThirdPartyClass'實現爲存根。 – littleadv