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 派生您的 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;
}

如果您只想访问您的私人会员,例如要在进行一些测试后阅读它的价值,您应该重新设计代码。从 class 外部访问私有成员不是一个好的设计。如果您仍然想这样做,您可以检查 this answer(为 C# 而不是 C++ 编写但仍然可用)。

P.S。要使用 override 关键字,您需要使用 C++11 支持进行编译。