当前位置: 首页 > 工具软件 > Gmock > 使用案例 >

Gmock的使用

闻人望
2023-12-01

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

 类似资料: