googlemock-如何模拟被测试类所拥有的对象

google mock - how to mock object owned by class under test

本文关键字:测试类 拥有 对象 何模拟 模拟 googlemock-      更新时间:2023-10-16

在本例中,

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对象?

我认为仅仅使用谷歌模拟宏是不可能做到这一点的。您必须将标识符NetworkClass重新定义为实际的NetworkClassMock,然后(为了测试的目的(将原始的NetworkClass重命名为类似NetworkClass_Orig的其他名称。

但这仍然不能帮助您访问用于测试目的的私有成员NetworkClass b

不能按原样模拟b。您需要使用依赖注入。

首先,您需要指定基类(或接口(,并从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;
}

如果你只是想访问你的私人成员,例如在做了一些测试后阅读它的价值,你应该重新设计你的代码。从班外访问私人成员不是一个好的设计。如果你仍然想这样做,你可以检查这个答案(为C#而不是C++编写,但仍然可用(。

附言:要使用override关键字,您需要使用C++11支持进行编译。