2010-11-30 65 views
8

我目前正在研究在C++中的一些单元测试图书馆的,并有一些问题:C++单元测试时,嘲讽的对象

  1. 似乎有是在如Boost.Test无嘲讽设施,但我很难想到的在不创建模拟对象/函数的情况下进行单元测试。你如何在boost.test中做到这一点,你是否在手动做(如何?我的意思是,有几种方法我可以想到,没有一种看起来不错)还是你只是在没有模拟对象的情况下做?

  2. googletest和googlemock看起来像很好的库与mockingsupport,但它需要每个对象,应该被嘲笑为虚拟。我不太喜欢这一点,但并不是我担心性能问题(我可以定义一个宏来让它脱离生产代码),但我觉得这非常具有侵扰性。我想知道是否有另一种解决方案不需要对现有代码进行太多改动? (爱Clojure的存在)

+3

手写你的嘲笑。你会发现你能做什么,不能做什么,用语言做。 – 2010-11-30 06:32:22

回答

6
  1. 的boost ::测试没有嘲弄的框架或库。如果你想嘲笑,你必须自己动手,或者使用像GMock这样的东西。当然,你可以使用谷歌模拟与Boost :: Test没有问题。
  2. 你还希望有什么东西可以嘲弄吗?这就是它在其他编程语言中的作用! (好吧,不是用鸭子打字,但是比虚拟方法承载更多的开销)如果你关心性能:

    1. 按照一般谷歌模拟文档中指定的虚拟方式实现一切。
    2. 将您的代码配置为不足以使用的地方
    3. 改为使用high-perf dependency injection替代那些配置文件的部分(或者说,代码中表示性能是问题的部分)。
    4. 不要用高性能的DI来替换所有的东西,因为那样会在整个屋顶上发送编译时间。

    尽管如此,我认为虚拟通话不会在性能上产生巨大差异。虚拟机不好的一种情况是它们位于内部循环的内部(例如在iostream库中,它们可能被输入或输出的每个字符调用),甚至只在性能敏感的代码中。

编辑:我错过了很重要的词在上面的问题#2不 - 你是不是担心性能。如果是这种情况,那么我的答案是你有效的拧紧。 C++中的普通函数或方法调用会生成一个纯方法调用,并且您无需更改调用点的位置。在大多数情况下,这并不需要大量的代码更改,因为正确的C++代码尽可能使用引用,尽管虚拟正在被使用,但不需要修改。然而,对于使用值语义的人来说,你将不得不小心,因为他们将受制于切片问题。

+0

>>你还希望有什么东西可以嘲弄?这就是它在其他编程语言中的作用!例如,你可以使用绑定形式 (binding [foo mock-foo] ...) – DaVinci 2010-11-30 07:52:44

6

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

4

免责声明我在Typemock工作。

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

explanation here

这样你就可以伪造公共,私有,抽象(而不实际创建一个具体的类),非虚,输出变量,例如直播等... 而且...... 这一切假货递归

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

我们将使用下面的代码

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