在这个例子中
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
对象?
我认为仅使用 google-mock 宏是不可能做到这一点的。
您必须重新定义标识符 NetworkClass
以实际表示 NetworkClassMock
,然后(出于测试目的)将原始 NetworkClass
重命名为其他名称像 NetworkClass_Orig
。
但这仍然不能帮助您出于测试目的访问私有(private)成员 NetworkClass b
。
最佳答案
您不能按原样模拟 b
。您将需要使用 Dependency Injection .
首先,您需要指定一个基类(或接口(interface))并从 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;
}
如果您只想访问您的私有(private)成员,例如要在进行一些测试后阅读它的值(value),您应该重新设计代码。从类外访问私有(private)成员不是一个好的设计。如果你仍然想这样做,你可以检查 this answer (为 C# 而不是 C++ 编写,但仍然可用)。
附言要使用 override 关键字,您需要使用 C++11 支持进行编译。
关于c++ - google mock - 如何模拟被测类拥有的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58525784/