【问题标题】:google mock - how to mock object owned by class under testgoogle mock - 如何模拟被测试类拥有的对象
【发布时间】:2023-03-23 10:13:01
【问题描述】:

在这个例子中

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 以进行测试。

【问题讨论】:

    标签: c++ unit-testing googlemock


    【解决方案1】:

    您不能照原样模拟b。您需要使用Dependency Injection

    首先您需要指定一个基类(或接口)并从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;
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2020-02-17
      • 2018-06-23
      • 2019-06-18
      相关资源
      最近更新 更多