googlemock-如何模拟被测试类所拥有的对象
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
对象?
我认为仅仅使用谷歌模拟宏是不可能做到这一点的。您必须将标识符NetworkClass
重新定义为实际的NetworkClassMock
,然后(为了测试的目的(将原始的NetworkClass
重命名为类似NetworkClass_Orig
的其他名称。
但这仍然不能帮助您访问用于测试目的的私有成员NetworkClass b
。
不能按原样模拟b
。您需要使用依赖注入。
首先,您需要指定基类(或接口(,并从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;
}
如果你只是想访问你的私人成员,例如在做了一些测试后阅读它的价值,你应该重新设计你的代码。从班外访问私人成员不是一个好的设计。如果你仍然想这样做,你可以检查这个答案(为C#而不是C++编写,但仍然可用(。
附言:要使用override关键字,您需要使用C++11支持进行编译。
相关文章:
- 使用gtest时,在头文件中而不是.cpp文件中具有可测试类的利弊
- googlemock-如何模拟被测试类所拥有的对象
- 单元测试类无法在我要测试的同一解决方案中的另一个项目中找到类
- gmock EXPECT_CALL 不会在测试类中调用该方法
- 使用专业化来测试类中值的存在
- 在C 中,是否有一种(新的)方法来测试类是否在模板中具有虚拟破坏者而无需实例化实例
- Boost单元测试夹具继承测试类,是否可以访问受保护的方法
- 如何从void*测试类
- 为什么无法识别此模板类拥有的类的类型(使用模板类型)
- 如何测试类B是否派生自类的模板族
- 如何通过SFINAE测试类中是否存在内部类
- C++预处理器测试类成员是否存在
- 访问提升测试类 - test_results和results_collector
- 试图用C++构造简单的测试类
- C++单元测试测试,使用模板测试类
- 如何使用 gmock 来测试类是否调用其基类的方法
- 使用 libtool 测试类是否可复制可构造
- 为什么允许类拥有自身的静态成员,而不允许拥有非静态成员?
- 虚函数和多态——无法在测试类中声明对象
- 如何根据头文件中定义的代码测试类