Google 开源其 C++ Mocking 框架

  • Abel Avram
  • 张龙

2008 年 12 月 18 日

话题:Java.NETGoogle语言 & 开发

几个月前Google 开源了其 C++ 测试框架,现在 Google 又基于BSD 协议将其C++ Mocking 框架Google Mock 开源。

在 Google 内部 Google Mock 被用在 100 多个项目中,根据 Google 软件工程师 Zhanyong Wan 所说,Google Mock 的灵感来自于jMockEasyMock。该框架可用在 Linux、Windows 及 Mac OS X 上,面向 C++ 开发者。Zhanyong 给出了一个mocking 的例子

class TaxServer {   // Returns the tax rate of a location (by postal code) or -1 on error.

  virtual double FetchTaxRate(

    const string& postal_code) = 0;

  virtual void CloseConnection() = 0;

};

class MockTaxServer : public TaxServer {     // #1

  MOCK_METHOD1(FetchTaxRate, double(const string&));

  MOCK_METHOD0(CloseConnection, void());

};

TEST(ShoppingCartTest,  StillCallsCloseIfServerErrorOccurs) {

  MockTaxServer mock_taxserver;              // #2

  EXPECT_CALL(mock_taxserver, FetchTaxRate(_)).

WillOnce(Return(-1));                   // #3

  EXPECT_CALL(mock_taxserver, CloseConnection());

  ShoppingCart cart(&mock_taxserver);        // #4

  cart.CalculateTax();  // Calls FetchTaxRate()

                        // and CloseConnection().

}                                            // #5

  1. 从接口派生出 mock 类。对于每个虚方法,计算它的参数个数、名字和结果 n,然后使用MOCK_METHODn进行定义,其参数就是方法的名字类型

  2. 创建该 mock 类的一个实例。当你使用真实对象时,实际使用的就是该 mock 对象。

  3. 设置该 mock 对象的期望(是否会被使用?将要做什么?)。例如,第一个EXPECT_CALL表示会调用FetchTaxRate()并返回一个错误。underscore (_) 是一个匹配器(matcher),表示参数可以是任何值。Google Mock 有很多可用的匹配器,你可以使用他们精确指定参数是什么。你还可以定义自己的匹配器或者使用一个确定的值。

  4. 使用 mock 对象的测试代码。如果某个 mock 方法的调用次数超过了期望值或是参数不正确你就会立刻看到一个错误。

  5. 当 mock 对象销毁时,系统会检查其上的期望是否都满足了。

这里是一些有用的链接:Google Mock 主页完整的文档二进制下载Google Mock for Dummies是对 Google Mock 的一个快速介绍,它还包含一些例子和说明。

查看英文原文:Google Has Open-Sourced Their C++ Mocking Framework

Java.NETGoogle语言 & 开发