用C++進入單元測試。看起來我需要在我去的時候寫幾個存根類。我的理解是Mock和Stubs有區別。基本上看來,Mocks是用於測試對象上發生的事情(例如驗證),而存根(stub)只是簡化了測試。我想嘲笑,我可以使用googlemock,但我沒有看到任何東西創建存根(ala RhinoMocks的GenerateStub)。C++單元測試:存根(不是嘲諷)?
有沒有辦法得到自動生成的存根? googlemock是否支持存根?還是我幾乎不得不手動創建存根來進行測試?
用C++進入單元測試。看起來我需要在我去的時候寫幾個存根類。我的理解是Mock和Stubs有區別。基本上看來,Mocks是用於測試對象上發生的事情(例如驗證),而存根(stub)只是簡化了測試。我想嘲笑,我可以使用googlemock,但我沒有看到任何東西創建存根(ala RhinoMocks的GenerateStub)。C++單元測試:存根(不是嘲諷)?
有沒有辦法得到自動生成的存根? googlemock是否支持存根?還是我幾乎不得不手動創建存根來進行測試?
我認爲這個難題的缺點在於,您不必對方法設置期望值,而是可以設置默認返回值。
嘲笑
所有在「Google Mock for Dummies」的討論和示例的重點是圍繞設定的預期。有關使用類似於下面的一些代碼一切談判:
EXPECT_CALL(turtle, PenDown())
.Times(AtLeast(1));
這是你想要的嘲諷,但磕碰你沒有任何期望。在閱讀介紹之後,我不知道如何使用googlemock進行存根。
存根
ratkok的評論使我瞭解如何設置默認返回值。下面是如何爲嘲笑對象,但沒有預期指定一個返回值:
ON_CALL(foo, Sign(_))
.WillByDefault(Return(-1));
http://code.google.com/p/googlemock/wiki/CookBook#Setting_the_Default_Actions_for_a_Mock_Method
看來,如果你調用一個沒有EXPECT_CALL的方法googlemock將發出警告。顯然,您可以通過使用NiceMock結構來防止此警告,或者您可以忽略它。此外,它似乎可以通過使用期望來避免警告(我不確定它是否是存根的好主意)。從Google Mock FAQ:
EXPECT_CALL(foo, Bar(_))
.WillRepeatedly(...);
我相信這正是我試圖弄清楚。
更新
我可以證實這一點的作品。我使用谷歌測試和googlemock一起編寫了一個單元測試,並且能夠使用ON_CALL爲類進行存根化。
是的,使用ON_CALL()和NiceMock正是我所指的。檢查那些維基頁面(谷歌模擬) - 這個模擬框架是非常強大和靈活的。 – ratkok 2011-06-16 04:15:14
模擬和存根之間的唯一區別是模擬強制行爲,而存根不存在。
據我所知,Google Mock的mock實際上是默認存根。他們只是強制行爲,如果你把各種方法的斷言。
已經覆蓋here我相信
This question也許有用/相關。
關於谷歌嘲笑 - 我們在我目前的項目中使用它來完全自動化存根實施。實際上,整個存根代碼庫都是使用谷歌模擬器來實現的。
不知道,但我聽到提振有一個單元測試庫。不幸的是,我必須承認,我從來沒有爲單元測試寫過代碼。 – AJG85 2011-06-14 23:42:53
是不是有某種可以生成一些模擬類的生成器python腳本? – Nim 2011-06-14 23:52:12
@aloneguid:真的嗎?我不相信。真正的C++人員使用適合他們應用的測試。 – 2011-06-14 23:52:40