[英]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
派生您的NetworkClass
和NetworkClassMock
。 然后你可以傳遞一個原始指針(最好是像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.