gtest和gmock入门实例

jopen 8年前

对于 c++ 来说写单元测试和 mock 框架不是一件容易的事情。还好, Google 为我们搭建了一个出色的单元测试和 mock 框架。网上的例子很多都过多强调概念,本文用一个简单的例子让大家对于什么是 gtest 和 gmock 让大家有一个直观的了解,让大家很快上手,就像写 hello word 一样容易。

gtest&gmock 的 1.6 版本的使用 make 编译,新版的已经已经迁移到 github 上使用 cmake 编译,安装过程很多,这里不在重复,如果大家有需要再单独写。

1.下载安装 Google Test and  Google Mock

2. 编译生成静态库gtest_main.a gmock_main.a (包含main库后不需要自己写main函数)

gmock用来对与为实现对象的接口模拟。

我们有一个Messgener.h接口,它的getMessage目前还没有实现,可以使用mock类提供的宏来模拟,这样就可以调试客户端程序,屏蔽Messgener.h的具体实现

#ifndef SRC_MESSENGER_H_  #define SRC_MESSENGER_H_    #include <string>  using namespace std;    class Messenger  {  public:      virtual ~Messenger() {}      virtual string getMessage() = 0;  };    #endif /* SRC_MESSENGER_H_ */

Messenger.h 的 mock 类

#ifndef SRC_MOCKMESSENGER_H_  #define SRC_MOCKMESSENGER_H_    #include "Messenger.h"  #include <string>  #include <gmock/gmock.h>  using namespace std;    class MockMessenger : public Messenger  {  public:      MOCK_METHOD0(getMessage, string());  };    #endif /* SRC_MOCKMESSENGER_H_ */

调用Messenger.h的客户端程序

HelloWorld.h

#ifndef SRC_HELLOWORLD_H_  #define SRC_HELLOWORLD_H_    #include <string>  #include "Messenger.h"  using namespace std;    class HelloWorld  {  public:      HelloWorld();      virtual ~HelloWorld();      string getMessage(Messenger* messenger) const;  };    #endif /* SRC_HELLOWORLD_H_ */

HelloWorld.cpp

#include "HelloWorld.h"  #include "Messenger.h"    HelloWorld::HelloWorld()  {  }    HelloWorld::~HelloWorld()  {  }    string HelloWorld::getMessage(Messenger* messenger) const  {      return messenger->getMessage();  }

有了要测试的代码和依赖的接口的mock模拟类,下面是gtest的单元测试写法:

#include "HelloWorld.h"  #include <gtest/gtest.h>  #include <gmock/gmock.h>  #include "MockMessenger.h"  #include <string>  #include <memory>  using namespace testing;    TEST(HelloWorldTest, getMessage)  {      MockMessenger messenger;      std::string msg = "Hello World";      EXPECT_CALL(messenger, getMessage()).WillRepeatedly(Return(ByRef(msg)));        HelloWorld helloWorld;      EXPECT_EQ("Hello World", helloWorld.getMessage(&messenger));      EXPECT_EQ("Hello World", helloWorld.getMessage(&messenger));      EXPECT_EQ("Hello World", helloWorld.getMessage(&messenger));  }

单元测试结果

</div>

来自: http://www.nginx.cn/4297.html