C++单元测试工具,现在市面上有很多并且不少都是免费开源的,这次要介绍的是gmock,来自大名鼎鼎的Google,gmock是包含了gtest的一个单元测试框架,在gtest基础上增加了许多便于开发人员进行mock打桩的接口等,可以理解为gtest负责进行测试,gmock负责测试前的打桩,gmock比起其他的cppunit等测试工具来说,最大的优点就是可以有简单的内置宏来定义一个类的mock类进行打桩,这为C++类单元测试带来了极大的便利。
下载gmock:
gmock下载内含gtest
git clone https://gitee.com/chahan/gmock.git
cd gmock
编译为gmock_main.a,改名为libgmock.a
cd make && make -j8 && mv gmock_main.a libgmock.a
编译为gtest_main.a,改名为libgtest.a
cd gtest/make &&make -j8 && mv gtest_main.a libgtest.a
cat interface.h
#include <iostream>
class Interface{
public:
virtual int add(int a,int b)=0;
};
class Context{
public:
virtual Interface* GetInstance()=0;
};
cat interface_mock.cc
实际使用时,应当将基类中的所有纯虚函数进行打桩,否则编译会报错
#include "interface.h"
#include "gtest/gtest.h"
#include "gmock/gmock.h"
struct MockInterface:public Interface{
MOCK_METHOD2(add,int(int a,int b));
};
struct MockContext:public Context{
MOCK_METHOD0(GetInstance,Interface*());
};
cat test_mock.cc
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "interface_mock.cc"
//#include "interface.h"
using namespace testing;
int test_func(Context *lp){
Interface* i = lp->GetInstance();
return i->add(1,200);
}
TEST(AAA,test_func){
MockInterface interface;
MockContext context;
ON_CALL(context,GetInstance()).WillByDefault(Return(&interface));
ON_CALL(interface,add(_,_)).WillByDefault(Return(1000));
EXPECT_EQ(1000,test_func(&context));
}
int main(int argc,char **argv)
{
testing::InitGoogleMock(&argc,argv);
return RUN_ALL_TESTS();
}
编译:
g++ interface_mock.cc test_mock.cc -L. -lgmock -lgtest -lpthread -I gmock/include/ -I gmock/gtest/include/ -std=c++11
运行:
./a.out
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from AAA
[ RUN ] AAA.test_func
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
test_mock.cc:15:
Function call: GetInstance()
Returns: 0x7fffbbc3c350
Stack trace:
GMOCK WARNING:
Uninteresting mock function call - taking default action specified at:
test_mock.cc:16:
Function call: add(1, 200)
Returns: 1000
Stack trace:
[ OK ] AAA.test_func (0 ms)
[----------] 1 test from AAA (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[ PASSED ] 1 test.
几个宏的说明:
MOCK_METHOD#1(#2, #3(#4) )
#1表示你要mock的方法共有几个参数
#2是你要mock的方法名称
#3表示这个方法的返回值类型
#4是这个方法具体的参数
通过ON_CALL/ EXPECT_CALL来设定桩函数的返回值,这2个宏的具体说明如下:
ON_CALL(#1, #2(#3)).WillByDefault(Return(#4));
#1表示mock对象
#2表示想定义的那个方法名称。
#3表示定义方法的参数,只有当传入的参数=#3的值时,才会生效,也可用_,表示匹配任何参数输入都生效
#4表示调用要返回值。
除了ON_CALL以外,还有EXPECT_CALL(#1, #2(#3)),参数含义同ON_CALL,还可以有额外的功能,比如:
EXPECT_CALL(#1, #2(#3)).Times(5).WillOnce(Return(100))
.WillOnce(Return(150))
.WillRepeatedly(Return(200));
表示第一次返回100,第二次调用返回150,后面全部返回200,以此类推。
reference:
https://blog.csdn.net/muyimo/article/details/124612417