簡體   English   中英

使用googlemock時,我是否可以避免在C ++界面中模擬所有方法

[英]Can I get away with not mocking all methods in an interface in C++ when using googlemock

我正在使用谷歌模擬1.6 RC,我正在嘗試模擬COM Interface COM接口中有近50種方法,其中一些方法是從基接口繼承的。 當我創建一個繼承自此接口的模擬struct並僅模擬我正在使用的方法時,我得到了cannot instantiate abstract class錯誤。

我想知道是否可以在googlemock中執行此操作。

這是不可能的。 您必須從所有接口(構造函數和析構函數除外)重載所有純虛方法。

您必須覆蓋從您直接或間接繼承的類中聲明為純虛擬的每個方法。 有兩個原因不想要全部覆蓋它們:

  1. 它們太多了,你有更好的時間來處理你的所有事情。
  2. 編譯一個模擬類,其中所有這些都被模擬出來太慢並且占用了太多內存。

(1)的修復是使用Google Mock scripts目錄中的gmock_gen.py腳本。 它遍歷類定義並將方法聲明轉換為MOCK_METHOD語句。 如果您遇到(2)的問題,可以用存根替換不必要的MOCK_METHOD語句:

MOCK_METHOD1(f, bool(int i));

virtual bool f(int i) {
  thrown std::exception("The stub for f(int) has been invoked unexpectedly.");
}

拋出異常將提醒您已調用特定存根的情況,這意味着您可能需要模擬它。

編輯:如果使用Microsoft的宏編寫模擬的原始接口,則此線程會發布一個腳本,將它們轉換為gmock_gen.py可接受的C ++。

我不完全確定是否應該在mock類中涵蓋所有方法...在gmock示例中,您可以看到例如析構函數不會被模擬。 因此我認為沒有必要嘲笑整個班級。

無論如何,你不應該創建模擬類而不是模擬結構嗎?

但是,腳本/生成器中有一個gmock_gen.py工具,可以為您完成模擬大類的艱苦工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM