google mock - 如何在测试中模拟 class 拥有的对象
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
对象?
我认为仅使用 google-mock 宏是不可能做到这一点的。
您必须重新定义标识符 NetworkClass
以实际表示 NetworkClassMock
,然后(出于测试目的)将原始 NetworkClass
重命名为其他名称,例如 NetworkClass_Orig
.
但这仍然不能帮助您出于测试目的访问私有成员NetworkClass b
。
你不能按原样嘲笑 b
。您将需要使用 Dependency Injection.
首先您需要指定一个基础 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 外部访问私有成员不是一个好的设计。如果您仍然想这样做,您可以检查 this answer(为 C# 而不是 C++ 编写但仍然可用)。
P.S。要使用 override 关键字,您需要使用 C++11 支持进行编译。
在这个例子中
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
.
但这仍然不能帮助您出于测试目的访问私有成员NetworkClass b
。
你不能按原样嘲笑 b
。您将需要使用 Dependency Injection.
首先您需要指定一个基础 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 外部访问私有成员不是一个好的设计。如果您仍然想这样做,您可以检查 this answer(为 C# 而不是 C++ 编写但仍然可用)。
P.S。要使用 override 关键字,您需要使用 C++11 支持进行编译。