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

时间:2010-05-13 13:55:55

标签: c++ mocking googlemock

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

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

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

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

4 个答案:

答案 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 ++与英语相结合。试一试!

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

答案 3 :(得分:6)

我已经专业地使用googletest + googlemock几年了,我非常喜欢它。其他人没有提到的一件事是,如果您已经承诺使用googletest,那么使用googlemock也很有意义。他们相当完美地融合并分享了类似的设计风格和理念,这很不错。

例如,googlemock提供了超级有用的ASSERT_THAT()宏,并与googletests&#39;很好地共存。断言。

但是,我会告诫你滥用googlemock的力量。它可能非常很容易编写非常复杂的&amp;强大的匹配器最终完全不可读。你只需要在使用它时受到纪律处分。

其他一些想法:

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