2011-06-14 24 views
8

用C++進入單元測試。看起來我需要在我去的時候寫幾個存根類。我的理解是Mock和Stubs有區別。基本上看來,Mocks是用於測試對象上發生的事情(例如驗證),而存根(stub)只是簡化了測試。我想嘲笑,我可以使用googlemock,但我沒有看到任何東西創建存根(ala RhinoMocks的GenerateStub)。C++單元測試:存根(不是嘲諷)?

有沒有辦法得到自動生成的存根? googlemock是否支持存根?還是我幾乎不得不手動創建存根來進行測試?

+0

不知道,但我聽到提振有一個單元測試庫。不幸的是,我必須承認,我從來沒有爲單元測試寫過代碼。 – AJG85 2011-06-14 23:42:53

+0

是不是有某種可以生成一些模擬類的生成器python腳本? – Nim 2011-06-14 23:52:12

+1

@aloneguid:真的嗎?我不相信。真正的C++人員使用適合他們應用的測試。 – 2011-06-14 23:52:40

回答

16

我認爲這個難題的缺點在於,您不必對方法設置期望值,而是可以設置默認返回值。

嘲笑

所有在「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爲類進行存根化。

+0

是的,使用ON_CALL()和NiceMock正是我所指的。檢查那些維基頁面(谷歌模擬) - 這個模擬框架是非常強大和靈活的。 – ratkok 2011-06-16 04:15:14

3

模擬和存根之間的唯一區別是模擬強制行爲,而存根不存在。

據我所知,Google Mock的mock實際上是默認存根。他們只是強制行爲,如果你把各種方法的斷言。

+0

我想我很困惑的是我想定義一個存根行爲。例如一個IsValidUser()方法將返回true。我不想在IsValidUser上創建一個預期,因爲我想測試其他的東西,而IsValidUser僅僅是測試另一種方法的依賴。但是googlemocks中的所有內容似乎都是圍繞創建期望而定位的 – User 2011-06-15 05:40:44

+1

您可以通過提供默認值/行爲來避免在Google模擬中設置期望值。此外,谷歌模擬框架讓你忽略意外調用,所以如果期望不存在,你的測試不會失敗。 – ratkok 2011-06-15 12:49:11

0

看看這個:stubgen和類似的討論here

This question也許有用/相關。

關於谷歌嘲笑 - 我們在我目前的項目中使用它來完全自動化存根實施。實際上,整個存根代碼庫都是使用谷歌模擬器來實現的。