簡體   English   中英

google mock - 如何在測試中模擬 class 擁有的 object

[英]google mock - how to mock object owned by class under test

在這個例子中

class A
{
public:
    A();
    ~A();

    virtual void func1();
    virtual void func2();

protected:
    virtual void func3();
private:
    // How do I mock this
    NetworkClass b;
}

如何模擬NetworkClass b object?

我認為僅使用 google-mock 宏是不可能做到這一點的。 您必須重新定義標識符NetworkClass以實際表示NetworkClassMock ,然后(出於測試目的)將原始NetworkClass重命名為NetworkClass_Orig之類的其他名稱。

但這仍然不能幫助您訪問私有成員NetworkClass b以進行測試。

您不能按原樣模擬b 您將需要使用依賴注入

首先,您需要指定 Base Class (或接口)並從INetworkClass派生您的NetworkClassNetworkClassMock 然后你可以傳遞一個原始指針(最好是像std::unique_ptr這樣的智能指針)或對class A的引用。 此輸入可以是您的實際實現NetworkClass或您的模擬NetworkClassMock

看這個例子:

#include <iostream>

class INetworkClass
{
public:
    virtual void doSomething() = 0;
};

class NetworkClass : public INetworkClass
{
public:
    void doSomething() override {std::cout << "Real class" << std::endl;} ;
};

class NetworkClassMock : public INetworkClass
{
public: 
    void doSomething() override {std::cout << "Mock class" << std::endl;};
};

class A
{
public:
    A(INetworkClass& b) : b(b) {};
    ~A() {};

    void func1() {b.doSomething();};

private:
    // How do I mock this
    INetworkClass& b;
};

int main(){
  NetworkClass real_class;
  NetworkClassMock mock_class;

  A a1(real_class);
  A a2(mock_class);

  a1.func1();
  a2.func1();

  return 0;
}

如果您只想訪問您的私人成員,例如在進行一些測試后讀取它的值,您應該重新設計您的代碼。 從 class 外部訪問私有成員不是一個好的設計。 如果你仍然想這樣做,你可以檢查這個答案(寫為 C# 而不是 C++ 但仍然可用)。

PS 要使用 override 關鍵字,您需要使用 C++11 支持進行編譯。

暫無
暫無

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

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