[英]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.