简介
- 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
定义模拟对象: 使用
MOCK_METHOD
宏定义一个模拟对象的方法。例如:1
2
3
4class MockClass {
public:
MOCK_METHOD(int, MyMethod, (int, double));
};设置期望: 在测试用例中使用 gmock 的宏来设置对模拟对象的期望。例如:
1
2
3MockClass mockObj;
EXPECT_CALL(mockObj, MyMethod(42, _))
.WillOnce(Return(3));运行测试: 在主函数中调用
::testing::InitGoogleMock
初始化 gmock,并运行所有测试用例:1
2
3
4int main(int argc, char** argv) {
::testing::InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}使用模拟对象: 在测试代码中使用模拟对象:
1
2MockClass mockObj;
// 使用 mockObj,调用 MyMethod(42, 3.14) 将返回 3
示例:
下面是一个简单的示例,演示如何使用 gmock 进行单元测试:
1 |
|
在这个示例中,MockMyInterface
是 MyInterface
的模拟类,通过设置 EXPECT_CALL
宏来设置对 GetValue
方法的期望。在测试中,调用 mockObj.GetValue()
将返回预期的值。这使得我们能够独立地测试代码,而不依赖于真实的 MyInterface
实现。
C++ gmock库 详解
Google Mock(gmock)是Google Test框架的一部分,是一个用于C++的模拟对象库,用于进行单元测试。以下是对 gmock
库的一些详解:
主要特性:
模拟类和接口:
gmock
允许你创建模拟类和接口,以替代真实的实现,并且模拟对象的行为是可控制的。定义模拟方法: 使用
MOCK_METHOD
宏可以在模拟类或接口中定义虚拟方法,表示该方法是一个模拟方法。1
2
3
4class MyInterface {
public:
virtual void DoSomething() = 0;
};设置模拟方法的行为: 使用
EXPECT_CALL
宏来设置对模拟方法的期望。可以指定方法的调用次数、返回值、抛出异常等。1
2
3
4
5MockMyInterface 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
2ON_CALL(mock, SomeMethod(_))
.WillByDefault(Invoke(&real_object, &RealObject::SomeMethod));
使用方法:
包含头文件: 在测试文件中,首先包含
gmock/gmock.h
头文件:1
定义模拟类或接口: 使用
MOCK_METHOD
宏在模拟类或接口中定义虚拟方法。1
2
3
4class MyInterface {
public:
virtual void DoSomething() = 0;
};设置期望: 在测试用例中使用
EXPECT_CALL
宏设置对模拟方法的期望。1
2
3
4
5MockMyInterface mock;
EXPECT_CALL(mock, DoSomething())
.Times(2)
.WillOnce(Return(42))
.WillOnce(Throw(std::runtime_error("Error")));运行测试: 在主函数中调用
::testing::InitGoogleMock
初始化 gmock,并运行所有测试用例。1
2
3
4int main(int argc, char** argv) {
::testing::InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}
示例:
下面是一个简单的示例,演示了如何使用 gmock
进行单元测试:
1 |
|
在这个示例中,MockMyInterface
是 MyInterface
的模拟类,通过设置 EXPECT_CALL
宏来设置对 GetValue
方法的期望。在测试中,调用 mockObj.GetValue()
将返回预期的值。这使得我们能够独立地测试代码,而不依赖于真实的 MyInterface
实现。