c++ - google mock - 如何模拟被测类拥有的对象

标签 c++ unit-testing googlemock

在这个例子中

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

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

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

关于c++ - google mock - 如何模拟被测类拥有的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58525784/

相关文章:

C++11 initializer_list 错误

java - 使用 Powermock 模拟类的构造函数时出现 ExceptionInInitializerError。如何解决?

javascript - 在 casperJs 测试中使用 jquery

c++ - 在 C++ 中动态引用不同类型的变量?

c++ - 如何使用 C++ 操作 PE 二进制文件中的节地址表?

c++ - 如何谷歌模拟从结构调用的方法

c++ - 为 gmock 自动生成模拟类

qt - 将 Gmock 设置为 QT (Windows)

javascript - 在 QML a la Pd 或 Max 中动态连接图形的节点(又名 "patching"接口(interface))

c# - 如何测试以确保接口(interface)除了列出的方法之外没有其他方法?