Google Mock(gMock)是 Google 提供的一个 C++ 测试框架,用于创建和使用模拟对象。它通常与 Google Test(gTest)一起使用,以便进行单元测试。以下是一个简单的 gMock 示例,展示了如何创建一个模拟类并使用它进行测试。
示例场景
假设我们有一个简单的接口 Calculator
,它有一个方法 Add
,我们想要测试一个使用这个接口的类 MathClient
。
1. 定义接口
// calculator.h
class Calculator {
public:
virtual ~Calculator() {}
virtual int Add(int a, int b) = 0;
};
2. 实现使用接口的类
// math_client.h
#include "calculator.h"
class MathClient {
public:
MathClient(Calculator* calculator) : calculator_(calculator) {}
int ComputeSum(int a, int b) {
return calculator_->Add(a, b);
}
private:
Calculator* calculator_;
};
3. 创建模拟类
// mock_calculator.h
#include <gmock/gmock.h>
#include "calculator.h"
class MockCalculator : public Calculator {
public:
MOCK_METHOD(int, Add, (int a, int b), (override));
};
4. 编写测试
// math_client_test.cpp
#include <gtest/gtest.h>
#include "mock_calculator.h"
#include "math_client.h"
TEST(MathClientTest, ComputeSum) {
MockCalculator mock_calculator;
// 设置期望值和返回值
EXPECT_CALL(mock_calculator, Add(3, 4))
.Times(1) // 期望调用一次
.WillOnce(::testing::Return(7)); // 返回7
MathClient client(&mock_calculator);
int result = client.ComputeSum(3, 4);
EXPECT_EQ(result, 7); // 验证结果
}
5. 编译和运行测试
确保你已经安装了 Google Test 和 Google Mock,并且在编译时链接了相应的库。可以使用以下命令编译和运行测试(假设你使用的是 g++):
g++ -std=c++11 -isystem /path/to/googletest/include -isystem /path/to/googlemock/include -pthread math_client_test.cpp /path/to/libgtest.a /path/to/libgmock.a -o math_client_test
./math_client_test
总结
在这个示例中,我们创建了一个简单的计算器接口和一个使用该接口的客户端类。我们使用 gMock 创建了一个模拟类,并在测试中设置了期望的调用和返回值。通过这种方式,我们可以在不依赖于实际实现的情况下测试 MathClient
的行为。