Google Mock是一个很好的模拟框架吗?

des*_*ons 62 c++ mocking googlemock

我是我公司的单元测试工作的先驱,需要选择一个模拟框架来使用.我之前从未使用过模拟框架.我们已经选择了Google Test,因此使用Google Mock会很不错.但是,在查看Google Mock的教程后,我的初步印象是:

  • 需要使用MOCK_METHODn宏重新声明模拟类中的每个方法似乎是不必要的,并且似乎违反了DRY原则.
  • 他们的匹配器(例如,EXPECT_CALL中的'_'(乌龟,前进(_));)和匹配顺序似乎太强大了.比如,很容易说出你不想要的东西,并错过那种错误.

我对Google的开发人员充满信心,对自己判断模拟框架的能力缺乏信心,以前从未使用过它们.所以我的问题是:这些有效的问题是什么?

或者没有更好的方法来定义模拟对象,并且在实践中直观地使用匹配器吗?我很感激之前使用过Google Mock的人的答案,并且与其他C++框架的比较会很有帮助.

Ste*_*hen 44

我经常使用它.

做相对简单的事情并且可能做很困难的事情是微不足道的 - 这几乎就是我想要的框架.

使用谷歌的模拟编写自定义匹配器(和其他东西)最困难的部分不是谷歌的模拟,它是C++的模板错误......它们几乎无法解析.我经常通过从一些不太复杂的表达式逐步构建一个工作表达式来编写复杂的表达式.这样,模板错误更容易查明.

我还没有看到更好的c ++模拟选项,谷歌的内容很多,所以我建议你试一试.

WRT the DRY原则,我同意声明嘲笑的方法是不幸的,但没有反思,我不确定c ++会不会有更多的运气.如果有办法,我几乎可以肯定,googlemock会使用它;)

BTW:googlemock食谱是一个很好的参考.

  • 我还决定最终选择谷歌嘲笑.最初,我认为它最大的缺点是你必须显式地编写一个mock类(使用DEFINE_METHODXXX宏).但是,我发现包中包含一个python脚本,可以为您生成模拟类. (4认同)

Era*_*'er 21

假 - 它是一个简单的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);
Run Code Online (Sandbox Code Playgroud)

还有许多其他功能需要探索.来吧试一试.


das*_*ndy 14

免责声明:我写过HippoMocks.

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

http://www.assembla.com/wiki/show/hippomocks


Ian*_*Ian 7

我已经专业地使用googletest + googlemock几年了,我非常喜欢它.其他人没有提到的一件事是,如果你已经致力于使用googletest,那么使用googlemock也很有意义.它们相当完美,并且拥有相似的设计风格和理念,这很不错.

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

不过,我会提醒你注意滥用googlemock的力量.它可以是非常诱人的编写非常复杂和强大的匹配是最终会被完全不可读.你只需要在使用它时受到纪律处分.

其他一些想法:

  • Googlemock可能会有一些陡峭的学习曲线; 复杂性和期望的复杂性并不像你希望的那样直截了当.
  • 对违反DRY的担忧是有效的; 当看起来它们可以很容易地自动生成时,必须手动定义模拟是很烦人的.团队编写自己的代码生成器(自动为其界面定义googlemocks)是相当常见的.