转载

gtest和gmock入门实例

对于 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)); }

单元测试结果

gtest和gmock入门实例
正文到此结束
Loading...