Google Mock是一个好的嘲讽框架吗?
我是我公司开拓性的unit testing工作,需要select一个嘲笑的框架来使用。 我以前从来没有使用过一个模拟框架。 我们已经select了Google Test,所以使用Google Mock会很好。 不过,在看过Google Mock的教程之后,我最初的印象是:
- 用MOCK_METHODnmacros来重新声明模拟类中每个方法的必要性似乎是不必要的,而且似乎违背了DRY原则。
- 它们的匹配器(例如,EXPECT_CALL(turtle,Forward(_));;中的'_')和匹配的顺序似乎太强大了。 比如,说一些你并不擅长的事情就很容易,而且错过了这样的错误。
我对Google的开发人员有很高的信心,对我自己判断嘲笑框架的能力缺乏信心,从来没有使用过。 所以我的问题是: 这些有效的担忧?
还是有没有更好的方法来定义一个模拟对象,并在实践中直观的匹配? 我希望以前使用过Google Mock的人的答案,并且与其他C ++框架进行比较会有帮助。
我经常使用它。
做相对容易的事情是微不足道的,而且可能做非常困难的事情 – 这几乎是我想要的框架。
用Google的mock编写自定义Matcher(和其他东西)最难的部分不是Google的嘲笑,这是C ++的模板错误……他们几乎不可能parsing。 我经常用一些不那么复杂的expression式来构build一个工作expression式来编写复杂的expression式。 这样,模板错误更容易查明。
我还没有看到更好的selectc + +嘲笑,谷歌覆盖了很多的地面,所以我build议你给它一个镜头。
WRT DRY的原则,我同意宣布嘲笑的方法是不幸的,但没有反思,我不知道C ++会有很多运气,否则。 如果有一种方法,我接近确定,googlemock会使用它;)
顺便说一句: googlemock食谱是一个很好的参考。
假 – 这是一个简单的C ++嘲笑框架。 FakeIt使用最新的C ++ 11function来创build一个expression(但非常简单)的API。 使用FakeIt,不需要重新声明方法,也不需要为每个模拟创build派生类。 这是你如何伪造:
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);
还有更多的function要探索。 来吧, 试试看吧 。
免责声明:我写了HippoMocks。
我可以推荐看看其他嘲讽的框架; 有一类不会让你重复自己。 他们也不再使用一种新的语法来匹配,使得你的代码阅读更像C ++和英语的结合。 试一试!
我一直使用googletest + googlemock专业几年,我绝对喜欢它。 有一件事没有被别人提及,如果你已经承诺使用googletest,那么使用googlemock也是很有意义的。 他们很好的整合,分享了相似的devise风格和理念,这很好。
例如,googlemock提供了超级有用的ASSERT_THAT()
macros,并且与googletests的断言很好地共存。
但是,我会告诫你滥用googlemock的权力。 编写非常复杂,function强大的匹配程序可能是非常诱人的,最终导致完全不可读。 你只需要在使用它时遵守纪律。
其他一些想法:
- Googlemock可以有一个陡峭的学习曲线; 匹配者和期望的错综复杂并不像你所希望的那样直截了当。
- 关于违反DRY的担心是有效的; 当看起来像是可以很容易地自动生成的时候,必须手动定义mock是很烦人的。 团队编写他们自己的代码生成器来自动定义他们的接口的googlemocks是相当普遍的。