我是我公司的单元测试工作的先驱,需要选择一个模拟框架来使用。我之前从未使用过模拟框架。我们已经选择了Google Test,因此使用Google Mock会很不错。但是,在查看Google Mock's tutorial后,我的初步印象是:
我对Google的开发人员充满信心,对自己判断模拟框架的能力缺乏信心,以前从未使用过它们。所以我的问题是:这些有效的问题是什么?
或者没有更好的方法来定义模拟对象,并且在实践中直观地使用匹配器吗?我很感激之前使用Google Mock的人的答案,并且与其他C ++框架的比较会有所帮助。
答案 0 :(得分:43)
我经常使用它。
做相对简单的事情并且可能做很困难的事情是微不足道的 - 这几乎就是我想要的框架。
使用谷歌的模拟编写自定义匹配器(和其他东西)最难的部分不是谷歌的模拟,它是C ++的模板错误......它们几乎无法解析。我经常通过从一些不太复杂的表达式逐步构建一个工作表达式来编写复杂的表达式。这样,模板错误就更容易确定。
我还没有看到更好的c ++模拟选项,谷歌的内容很多,所以我建议你试一试。
WRT the DRY原则,我同意宣布嘲弄的方法是不幸的,但没有反思,我不确定c ++会不会有更多的运气。如果有办法,我几乎可以肯定,googlemock会使用它;)
BTW:googlemock cookbook是一个很好的参考。
答案 1 :(得分:20)
Fake-It是一个简单的C ++模拟框架。 FakeIt使用最新的C ++ 11功能来创建一个富有表现力(但非常简单)的API。 使用FakeIt,不需要重新声明方法,也不需要为每个模拟创建派生类。 这是你假装的方式:
struct SomeInterface {
virtual int foo(int) = 0;
};
// That's all you have to do to create a mock.
Mock<SomeInterface> mock;
// Stub method mock.foo(any argument) to return 1.
When(Method(mock,foo)).Return(1);
// Fetch the SomeInterface instance from the mock.
SomeInterface &i = mock.get();
// Will print "1"
cout << i.foo(10);
还有许多其他功能需要探索。继续give it a try。
答案 2 :(得分:14)
免责声明:我写过HippoMocks。
我可以推荐查看其他模拟框架;有一类不会让你重复自己。它们还消除了一种新的匹配语法,使您的代码更像C ++与英语相结合。试一试!
答案 3 :(得分:6)
我已经专业地使用googletest + googlemock几年了,我非常喜欢它。其他人没有提到的一件事是,如果您已经承诺使用googletest,那么使用googlemock也很有意义。他们相当完美地融合并分享了类似的设计风格和理念,这很不错。
例如,googlemock提供了超级有用的ASSERT_THAT()
宏,并与googletests&#39;很好地共存。断言。
其他一些想法: