简介
- gmock库笔记
C++ gmock是什么
Google Mock(gmock)是Google开发的C++的一个模拟对象库,用于进行单元测试时生成模拟(mock)对象。Google Mock结合Google Test(gtest),可以帮助开发人员进行单元测试,特别是在涉及到依赖对象(如外部库、接口等)的情况下。
以下是对 gmock 的主要特点和用法的简要说明:
主要特点:
-
模拟对象: gmock 允许你创建模拟对象,这些对象可以替代真实的对象,用于测试代码的各个部分。
-
期望与行为: 你可以设置对模拟对象的期望,定义它应该如何被调用以及返回什么值。这允许你测试被测试对象与其依赖关系的交互。
-
模拟方法: 通过使用
ON_CALL
宏,你可以为模拟对象的方法设置行为,使其在调用时返回指定的值。 -
参数匹配: gmock 提供了多种参数匹配器,以灵活匹配模拟对象方法的参数。
-
死亡测试(Death Tests): 可以使用
EXPECT_DEATH
和ASSERT_DEATH
宏测试代码是否导致了程序的异常退出。
使用方法:
-
包含头文件: 在测试文件中,首先包含
gmock/gmock.h
头文件:1
#include <gmock/gmock.h>
-
定义模拟对象: 使用
MOCK_METHOD
宏定义一个模拟对象的方法。例如:1 2 3 4
class MockClass { public: MOCK_METHOD(int, MyMethod, (int, double)); };
-
设置期望: 在测试用例中使用 gmock 的宏来设置对模拟对象的期望。例如:
1 2 3
MockClass mockObj; EXPECT_CALL(mockObj, MyMethod(42, _)) .WillOnce(Return(3));
-
运行测试: 在主函数中调用
::testing::InitGoogleMock
初始化 gmock,并运行所有测试用例:1 2 3 4
int main(int argc, char** argv) { ::testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS(); }
-
使用模拟对象: 在测试代码中使用模拟对象:
1 2
MockClass mockObj; // 使用 mockObj,调用 MyMethod(42, 3.14) 将返回 3
示例:
下面是一个简单的示例,演示如何使用 gmock 进行单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <gmock/gmock.h>
class MyInterface {
public:
virtual int GetValue() const = 0;
};
class MockMyInterface : public MyInterface {
public:
MOCK_METHOD(int, GetValue, (), (const, override));
};
TEST(MyTestSuite, TestName) {
MockMyInterface mockObj;
EXPECT_CALL(mockObj, GetValue())
.WillOnce(::testing::Return(42));
int result = mockObj.GetValue();
ASSERT_EQ(result, 42);
}
在这个示例中,MockMyInterface
是 MyInterface
的模拟类,通过设置 EXPECT_CALL
宏来设置对 GetValue
方法的期望。在测试中,调用 mockObj.GetValue()
将返回预期的值。这使得我们能够独立地测试代码,而不依赖于真实的 MyInterface
实现。
C++ gmock库 详解
Google Mock(gmock)是Google Test框架的一部分,是一个用于C++的模拟对象库,用于进行单元测试。以下是对 gmock
库的一些详解:
主要特性:
-
模拟类和接口:
gmock
允许你创建模拟类和接口,以替代真实的实现,并且模拟对象的行为是可控制的。 -
定义模拟方法: 使用
MOCK_METHOD
宏可以在模拟类或接口中定义虚拟方法,表示该方法是一个模拟方法。1 2 3 4
class MyInterface { public: virtual void DoSomething() = 0; };
-
设置模拟方法的行为: 使用
EXPECT_CALL
宏来设置对模拟方法的期望。可以指定方法的调用次数、返回值、抛出异常等。1 2 3 4 5
MockMyInterface mock; EXPECT_CALL(mock, DoSomething()) .Times(2) .WillOnce(Return(42)) .WillOnce(Throw(std::runtime_error("Error")));
-
参数匹配:
gmock
提供了参数匹配器,可以灵活地匹配模拟方法的输入参数。1
EXPECT_CALL(mock, SomeMethod(NotNull(), _, 5));
-
委托模拟方法的行为: 使用
WillByDefault
宏可以指定模拟方法的默认行为。1 2
ON_CALL(mock, SomeMethod(_)) .WillByDefault(Invoke(&real_object, &RealObject::SomeMethod));
使用方法:
-
包含头文件: 在测试文件中,首先包含
gmock/gmock.h
头文件:1
#include <gmock/gmock.h>
-
定义模拟类或接口: 使用
MOCK_METHOD
宏在模拟类或接口中定义虚拟方法。1 2 3 4
class MyInterface { public: virtual void DoSomething() = 0; };
-
设置期望: 在测试用例中使用
EXPECT_CALL
宏设置对模拟方法的期望。1 2 3 4 5
MockMyInterface mock; EXPECT_CALL(mock, DoSomething()) .Times(2) .WillOnce(Return(42)) .WillOnce(Throw(std::runtime_error("Error")));
-
运行测试: 在主函数中调用
::testing::InitGoogleMock
初始化 gmock,并运行所有测试用例。1 2 3 4
int main(int argc, char** argv) { ::testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS(); }
示例:
下面是一个简单的示例,演示了如何使用 gmock
进行单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <gmock/gmock.h>
class MyInterface {
public:
virtual int GetValue() const = 0;
};
class MockMyInterface : public MyInterface {
public:
MOCK_METHOD(int, GetValue, (), (const, override));
};
TEST(MyTestSuite, TestName) {
MockMyInterface mockObj;
EXPECT_CALL(mockObj, GetValue())
.WillOnce(::testing::Return(42));
int result = mockObj.GetValue();
ASSERT_EQ(result, 42);
}
在这个示例中,MockMyInterface
是 MyInterface
的模拟类,通过设置 EXPECT_CALL
宏来设置对 GetValue
方法的期望。在测试中,调用 mockObj.GetValue()
将返回预期的值。这使得我们能够独立地测试代码,而不依赖于真实的 MyInterface
实现。