对于 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)); }
单元测试结果