2010-11-30 68 views
8

我目前正在研究在C++中的一些單元測試圖書館的,並有一些問題:C++單元測試時,嘲諷的對象

  1. 似乎有是在如Boost.Test無嘲諷設施,但我很難想到的在不創建模擬對象/函數的情況下進行單元測試。你如何在boost.test中做到這一點,你是否在手動做(如何?我的意思是,有幾種方法我可以想到,沒有一種看起來不錯)還是你只是在沒有模擬對象的情況下做?

  2. googletest和googlemock看起來像很好的庫與mockingsupport,但它需要每個對象,應該被嘲笑爲虛擬。我不太喜歡這一點,但並不是我擔心性能問題(我可以定義一個宏來讓它脫離生產代碼),但我覺得這非常具有侵擾性。我想知道是否有另一種解決方案不需要對現有代碼進行太多改動? (愛Clojure的存在)

+3

手寫你的嘲笑。你會發現你能做什麼,不能做什麼,用語言做。 – 2010-11-30 06:32:22

回答

6
  1. 的boost ::測試沒有嘲弄的框架或庫。如果你想嘲笑,你必須自己動手,或者使用像GMock這樣的東西。當然,你可以使用谷歌模擬與Boost :: Test沒有問題。
  2. 你還希望有什麼東西可以嘲弄嗎?這就是它在其他編程語言中的作用! (好吧,不是用鴨子打字,但是比虛擬方法承載更多的開銷)如果你關心性能:

    1. 按照一般谷歌模擬文檔中指定的虛擬方式實現一切。
    2. 將您的代碼配置爲不足以使用的地方
    3. 改爲使用high-perf dependency injection替代那些配置文件的部分(或者說,代碼中表示性能是問題的部分)。
    4. 不要用高性能的DI來替換所有的東西,因爲那樣會在整個屋頂上發送編譯時間。

    儘管如此,我認爲虛擬通話不會在性能上產生巨大差異。虛擬機不好的一種情況是它們位於內部循環的內部(例如在iostream庫中,它們可能被輸入或輸出的每個字符調用),甚至只在性能敏感的代碼中。

編輯:我錯過了很重要的詞在上面的問題#2不 - 你是不是擔心性能。如果是這種情況,那麼我的答案是你有效的擰緊。 C++中的普通函數或方法調用會生成一個純方法調用,並且您無需更改調用點的位置。在大多數情況下,這並不需要大量的代碼更改,因爲正確的C++代碼儘可能使用引用,儘管虛擬正在被使用,但不需要修改。然而,對於使用值語義的人來說,你將不得不小心,因爲他們將受制於切片問題。

+0

>>你還希望有什麼東西可以嘲弄?這就是它在其他編程語言中的作用!例如,你可以使用綁定形式 (binding [foo mock-foo] ...) – DaVinci 2010-11-30 07:52:44

6

Turtle是明確設計用於Boost.Test,看起來非常好。

4

免責聲明我在Typemock工作。

Typemock Isolator++可以嘲笑任何東西!你不需要虛擬 - 一切都是Mockable

explanation here

這樣你就可以僞造公共,私有,抽象(而不實際創建一個具體的類),非虛,輸出變量,例如直播等... 而且...... 這一切假貨遞歸

class MyClass 
{ 
    int GetResult() { return -1; } 
} 

我們將使用下面的代碼

MyClass* fakeMyClass = FAKE<MyClass>(); // every call to fakeMyClass will be faked 
WHEN_CALLED(fakeMyClass->GetResult()).Return(10);