谷歌模拟-如何模拟被测类拥有的对象

时间:2019-10-23 15:00:32

标签: c++ unit-testing googlemock

在此示例中

$.ajax(document.referrer)
    .done(function(html) { 
        var urls = $("<div/>").html(html)
                     .find("a")
                     .map(function(i, e) { return $(this).attr("href"); }
    });

如何模拟class A { public: A(); ~A(); virtual void func1(); virtual void func2(); protected: virtual void func3(); private: // How do I mock this NetworkClass b; } 对象?

我认为仅使用google-mock宏是不可能的。 您必须重新定义标识符NetworkClass b来实际表示NetworkClass,然后(出于测试目的)将原始NetworkClassMock重命名为NetworkClass之类的东西。

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

1 个答案:

答案 0 :(得分:1)

您不能照原样嘲笑b。您将需要使用Dependency Injection

首先,您需要指定基类(或接口),并从NetworkClass派生NetworkClassMockINetworkClass。然后,您可以传递原始指针(最好使用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;
}

如果您只想访问您的私人成员,例如要在执行一些测试后读取它的价值,您应该重新设计代码。从班级外部访问私人成员不是一个好的设计。如果仍要执行此操作,则可以检查this answer(为C#而不是C ++编写,但仍可用)。

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