需要一个很好的方法来测试Google Test中的Factory类

时间:2016-02-11 21:25:00

标签: c++ unit-testing googletest

我是谷歌测试的新手,一般来说是C ++的新手。看一下下面的简化示例,测试CDeviceCreator的一般方法是什么?我是否一定需要模拟。我读过关于谷歌测试中的嘲笑,但很难理解它。能否请您提供一个特定于此案例的示例。提前致谢。

这是工厂类的接口

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;
    }
};

1 个答案:

答案 0 :(得分:3)

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

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

  • 使用(脏)预处理器技巧,例如#defining CAnalogDevice到单元测试中的其他内容。
  • 链接您的CAnalogDevice的测试特定实现。这个实现可能是一个模拟,但在这个简单的例子中,最简单的东西(如存根)也可能做得很好。

总结:你不一定要使用模拟,但很可能你必须做一些事情才能实现隔离。当然,对于CDigitalDevice来说,这一切都是一样的。

您可能会发现一些有价值的其他建议:

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

    IDevice * digDev;
    digDev = new CDigitalDevice();
    

    喜欢

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

    IDevice * const digDev = new CDigitalDevice();