C ++单元测试,模拟对象

时间:2010-11-30 00:14:41

标签: c++ unit-testing

我目前正在用C ++查看一些单元测试库,并有一些问题:

  1. 在boost.test中似乎没有模拟工具,但我很难想象在没有创建模拟对象/函数的情况下进行单元测试。你怎么在boost.test中做到这一点,你是手动做的(怎么样?我的意思是,有几种方法我可以想到,这些看起来都不好)或者你只是没有模拟对象吗?

    < / LI>
  2. googletest和googlemock看起来像带有mockingsupport的好库但是,它要求每个被模拟的对象都是虚拟的。我不是很喜欢这个,并不是我担心性能(我可以定义一个宏来解决它的生产代码)但是我觉得这非常具有侵入性。我想知道是否有另一种解决方案不需要对现有代码进行太多更改? (喜欢那里的clojure)

3 个答案:

答案 0 :(得分:6)

  1. Boost :: Test没有模拟框架或库。如果你想要嘲笑,你必须自己做,或者使用像GMock这样的东西。当然,你可以毫无问题地使用谷歌模拟和Boost :: Test。
  2. 你还有什么期望可以模仿的东西?这就是它在其他所有编程语言中的工作方式! (好吧,不是用鸭子打字,但是它比虚拟方法带来更多开销)如果你担心性能:

    1. 按照一般谷歌模拟文档中指定的虚拟方式实施所有内容。
    2. 为不够的地方配置代码
    3. 使用high-perf dependency injection替换那些已分析的部分(或者更确切地说,代码段中表示性能有问题)。
    4. 请勿使用高性能DI替换所有内容,因为这会将编译时间发送到屋顶。
    5. 尽管如此,我认为虚拟呼叫不会在性能方面产生巨大差异。虚拟数据不好的一种情况是它们位于内部循环内部(例如在iostream库中,可能为输入或输出的每个字符调用它们),甚至只在性能敏感的情况下代码

      编辑:我错过了上述问题#2中非常重要的单词 not - 您担心性能。如果是这样的话,那么我的回答是你有效地搞砸了。 C ++中的普通函数或方法调用生成普通方法调用,并且没有机会让您更改调用指向的位置。在大多数情况下,这不需要太多代码更改,因为正确的C ++代码尽可能使用引用,尽管正在使用虚拟,但不需要修改。但是,对于使用值语义的人来说,你必须要小心,因为它们会受到切片问题的影响。

答案 1 :(得分:6)

Turtle明确设计用于Boost.Test,看起来非常好。

答案 2 :(得分:4)

免责声明我在Typemock工作。

Typemock Isolator++可以嘲笑任何事情!你不需要虚拟 - 一切都是Mockable

请参阅explanation here

所以你可以伪造公共,私有,抽象(没有实际创建具体类),非虚拟,out参数,实例等... 和... 它以递归方式伪造所有内容

class MyClass
{
   int GetResult() { return -1; }
}

我们将使用以下代码

MyClass* fakeMyClass = FAKE<MyClass>(); // every call to fakeMyClass will be faked 
WHEN_CALLED(fakeMyClass->GetResult()).Return(10);
相关问题