我目前正在用C ++查看一些单元测试库,并有一些问题:
在boost.test中似乎没有模拟工具,但我很难想象在没有创建模拟对象/函数的情况下进行单元测试。你怎么在boost.test中做到这一点,你是手动做的(怎么样?我的意思是,有几种方法我可以想到,这些看起来都不好)或者你只是没有模拟对象吗?
< / LI>googletest和googlemock看起来像带有mockingsupport的好库但是,它要求每个被模拟的对象都是虚拟的。我不是很喜欢这个,并不是我担心性能(我可以定义一个宏来解决它的生产代码)但是我觉得这非常具有侵入性。我想知道是否有另一种解决方案不需要对现有代码进行太多更改? (喜欢那里的clojure)
答案 0 :(得分:6)
你还有什么期望可以模仿的东西?这就是它在其他所有编程语言中的工作方式! (好吧,不是用鸭子打字,但是它比虚拟方法带来更多开销)如果你担心性能:
尽管如此,我认为虚拟呼叫不会在性能方面产生巨大差异。虚拟数据不好的一种情况是它们位于内部循环内部(例如在iostream
库中,可能为输入或输出的每个字符调用它们),甚至只在性能敏感的情况下代码
编辑:我错过了上述问题#2中非常重要的单词 not - 您不担心性能。如果是这样的话,那么我的回答是你有效地搞砸了。 C ++中的普通函数或方法调用生成普通方法调用,并且没有机会让您更改调用指向的位置。在大多数情况下,这不需要太多代码更改,因为正确的C ++代码尽可能使用引用,尽管正在使用虚拟,但不需要修改。但是,对于使用值语义的人来说,你必须要小心,因为它们会受到切片问题的影响。
答案 1 :(得分:6)
Turtle明确设计用于Boost.Test,看起来非常好。
答案 2 :(得分:4)
免责声明我在Typemock工作。
Typemock Isolator++可以嘲笑任何事情!你不需要虚拟 - 一切都是Mockable
所以你可以伪造公共,私有,抽象(没有实际创建具体类),非虚拟,out参数,实例等... 和... 它以递归方式伪造所有内容
class MyClass
{
int GetResult() { return -1; }
}
我们将使用以下代码
MyClass* fakeMyClass = FAKE<MyClass>(); // every call to fakeMyClass will be faked
WHEN_CALLED(fakeMyClass->GetResult()).Return(10);