c++ - 需要一个好的方法来在 Google Test 中测试工厂类

标签 c++ unit-testing googletest

我是 google test 的新手,总体来说对 C++ 也比较陌生。看下面的简化示例,测试 CDeviceCreator 的通用方法是什么?我一定需要模拟吗?我在谷歌测试中读到过有关模拟的内容,但很难理解它。您能否提供一个针对此案例的具体示例?提前致谢。

这是工厂类的接口(interface)

class IDeviceCreator
{
public:
    IDeviceCreator(){
    };
    virtual ~IDeviceCreator(){
    };
    virtual IDevice * CreateAnalogDevice() = 0 ;
    virtual IDevice * CreateDigitalDevice() = 0 ;
};

鉴于:CANalogDevice 和 CDigitalDevice 正在实现 IDevice

这是具体工厂类

class CDeviceCreator : public IDeviceCreator
{
public:
    IDeviceCreator(){
    }
    virtual ~IDeviceCreator(){
    }
    virtual IDevice * CreateAnalogDevice(){
        IDevice * anlogDev;
        anlogDev = new CAnalogDevice();
        return anlogDev;
    }
    virtual IDevice * CreateDigitalDevice(){
        IDevice * digDev;
        digDev = new CDigitalDevice();
        return digDev;
    }
};

最佳答案

您的方法 CDeviceCreator::CreateAnalogDevice 调用构造函数 CAnalogDevice。最有可能的是,真正的构造函数实际上不应该在单元测试期间被调用:可能它的使用会导致“烦恼”,例如a)引入硬件依赖性,从而使得无法在开发环境而不是目标上运行单元测试系统,b)如果相应的代码很大或者链接很多其他代码,则增加构建时间,c)可能库尚未完成或处于错误状态,d)...

出于这个原因,您希望将您的代码与这个真正的构造函数隔离开来,并使用替代品。您有几种实现隔离的可能性:

  • 在单元测试中使用(肮脏的)预处理器技巧,例如 #defining CANalogDevice 到其他内容。
  • 链接到您的测试特定的 CAnalogDevice 实现。此实现可以是一个模拟,但在这个简单的示例中,很可能更简单的东西(如 stub )也可以做到同样的效果。

总结:您不一定必须使用模拟,但很可能您必须采取一些措施来实现隔离。当然,这对于 CDigitalDevice 来说也是一样的。

还有一些您可能会发现有值(value)的其他建议:

  • 您应该养成在定义时初始化值的习惯。也就是说,而不是写

    IDevice * digDev;
    digDev = new CDigitalDevice();
    

    更喜欢

    IDevice * digDev = new CDigitalDevice();
    
  • 有些人(包括我自己)喜欢在任何地方使用 const。例如,在更改初始化后如上所示:

    IDevice * const digDev = new CDigitalDevice();
    

关于c++ - 需要一个好的方法来在 Google Test 中测试工厂类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35350332/

相关文章:

c++ - 将 Google Mock 与 boost::bind 结合使用

c++ - 如何使 for 循环中的变量大于原来的变量

c++ - Microsoft Visual C++ 的两阶段模板实例化的 "broken"到底是什么?

c++ - C++和clang打包的属性

unit-testing - PHPUnit 不加载某些测试

c++ - C++ FakeIt 库多重继承

c++ - SDL 窗口无响应

javascript - Node.js Istanbul/Mocha 单元测试不打印详细信息

java - 使用 RecursiveElementNameAndTextQualifier(XMLUnit)

c++ - 使用头文件的静态方法c++的GoogleTest