C++ 谷歌模拟是一个好的模拟框架吗?

C++ 谷歌模拟是一个好的模拟框架吗?,c++,mocking,googlemock,C++,Mocking,Googlemock,我在我的公司开创了单元测试的先河,需要选择一个模拟框架来使用。我以前从未使用过模拟框架。我们已经选择了GoogleTest,所以使用GoogleMock会很好。不过,我看了之后的初步印象是: 需要用MOCK_METHODn宏重新声明mocking类中的每个方法似乎是不必要的,而且似乎违背了DRY原则 他们的匹配者(例如,EXPECT_调用中的“u”(海龟,Forward())和匹配顺序似乎太强大了。比如说,你很容易说出你不想说的话,然后这样想念虫子 我对谷歌的开发人员有很高的信心,而对我自己

我在我的公司开创了单元测试的先河,需要选择一个模拟框架来使用。我以前从未使用过模拟框架。我们已经选择了GoogleTest,所以使用GoogleMock会很好。不过,我看了之后的初步印象是:

  • 需要用MOCK_METHODn宏重新声明mocking类中的每个方法似乎是不必要的,而且似乎违背了DRY原则
  • 他们的匹配者(例如,EXPECT_调用中的“u”(海龟,Forward())和匹配顺序似乎太强大了。比如说,你很容易说出你不想说的话,然后这样想念虫子
我对谷歌的开发人员有很高的信心,而对我自己判断模拟框架的能力却信心不足,因为我以前从未使用过这些框架。因此,我的问题是:这些担忧是否合理?

还是没有更好的方法来定义模拟对象,匹配器在实践中使用是否直观?我会很感激以前使用过谷歌模拟的人的答案,和其他C++框架的比较会有帮助。

< P>我经常使用它。 做相对简单的事情很简单,也可能做非常困难的事情——这正是我希望从一个框架中得到的

用Google的Mock编写自定义匹配器(以及其他东西)最困难的部分不是Google的Mock,而是C++的模板错误。。。它们几乎无法解析。我经常通过从几个不太复杂的表达式逐步构建工作表达式来编写复杂表达式。这样,模板错误更容易确定

我还没有看到一个更好的C++嘲讽选项,谷歌覆盖了很多的基础,所以我建议你试试。 我同意声明嘲弄的方法是不幸的,但是没有反思,我不确定C++会有多大的运气。我几乎可以肯定,如果有办法的话,Google Mock会使用它;)


顺便说一句:这是一个很好的参考。

免责声明:我写了《河马》

我可以推荐其他模拟框架;有一类人不会让你重复你自己。他们还取消了一个新的语法匹配,使你的代码阅读更像C++ +英语结合。试试看

是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);
struct接口{
虚拟整数foo(int)=0;
};
//这就是创建模拟所需的全部操作。
模仿;
//存根方法mock.foo(任何参数)返回1。
When(方法(mock,foo))。返回(1);
//从模拟获取SomeInterface实例。
SomeInterface&i=mock.get();
//将打印“1”

cout几年来,我一直在专业地使用googletest+googlemock,我绝对喜欢它。有一件事别人没有提到,如果你已经承诺要使用googletest,那么也使用googlemock是很有意义的。它们很好地结合在一起,有着相似的设计风格和理念,这很好

例如,googlemock提供了非常有用的
ASSERT_THAT()
宏,并且与googletests的断言很好地共存

不过,我要提醒你不要滥用谷歌mock的功能。编写非常复杂且功能强大的匹配程序,最终完全无法阅读,这是非常诱人的。你只需要在使用它时遵守纪律

其他一些想法:

  • Googlemock的学习曲线可能有些陡峭;匹配者和期望的复杂性并不像你希望的那样直截了当
  • 对违反DRY的担忧是有效的;当mock看起来可以很容易地自动生成时,手动定义mock是很烦人的。团队编写自己的代码生成器,自动为其接口定义GoogleMock是很常见的

感谢您的反馈,我绝对不会从教程中得到这些!关于DRY,请参阅我对一个关于管理mock样板代码生成的问题的回答:我还决定最终使用googlemock。最初,我认为它最大的缺点是必须显式地编写一个模拟类(使用DEFINE_METHODXXX宏)。但是,我发现包中包含一个python脚本,可以为您生成模拟类。对于“重新声明”部分,请注意
gmock_gen.py
通常可以为您编写模拟(给定头文件和基类作为输入)。由于C++是复杂的,它可能会被篡改,但它仍然会覆盖大部分的用例,所以它确实加快了速度。不幸的是,我怀疑这里的人会使用它。不过,我可以试试。还没有提到的是
googlemock
的移动语义支持,而这一支持基本上是不存在的。不能将仅移动类型用作参数,也不能将右值引用用作参数。不幸的是,据我所知,谷歌团队最近没有更新项目的计划。谢谢,我会看一看。不需要创建单独的模拟类是一个很好的功能!那么如果你的类没有虚拟接口呢?如果您的设计是基于策略的,并且所有代码都是模板化的,那会怎么样?那么我可以使用这个框架吗?