簡體   English   中英

使用 googlemock 由聚合對象調用的模擬函數

[英]Mock function called by aggregate object using googlemock

我有一個場景,其中在本地對象中實例化以調用該類的方法,即setSessionId() setSessionId 的定義如下:

int Cli::setSessionId()
{
    SessionHandler oHandleSession;
    return oHandleSession.getSessionId(sSessionId);
}

現在為了模擬SessionHandler函數,我使用宏在要模擬的函數之前添加virtual關鍵字,在這種情況下getSessionId()因為這個類不是抽象的,函數也不是純虛擬的。(我知道 Hi-Perf依賴注入但現階段不想進入)

如果是這樣的話

int Cli::setSessionId(SessionHandler* oHandleSession)
{
  ...
  return oHandleSession->getSessionId(sSessionId);
}

將模擬對象傳遞給函數setSessionid()本來很簡單,但是由於使用了聚合,我如何模擬這個函數getSessionId()

您可以使用靜態多態,也可以使用鏈接時替換。

對於靜態多態性,您可以執行以下操作:

class DefaultSessionHandler {
  // methods implemented as you do now
};

template <typename T>
class SessionHandlerT {
  // methods implemented in terms of delegation to methods on T
};

using SessionHandler = SessionHandlerT<DefaultSessionHandler>; 

這可能有點麻煩,並且會引入額外的編譯時間,雖然它可以工作,但我不太喜歡這種方法,即使我以前做過多次。

通過鏈接時替換,您可以提供SessionHandler的替代實現並在鏈接時解決這種情況。 這意味着您有一些SessionHandler類的其他實現,即使它具有相同的名稱,它也會做一些不同的事情。 同樣,這很麻煩,但可以使其起作用。

這兩種方法都有各自的問題和痛苦。 一種更好的單元測試方法是通過重構 SUT 來簡單地使用依賴注入。

另一種方法是放棄單元測試而只執行集成測試。 這也有它自己的一系列問題。

暫無
暫無

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

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