寻求基于Googlemock实现依赖注入与mock的可复制运行完整代码示例
可直接运行的GoogleMock依赖注入完整示例
前置要求
- 本地已安装1.11及以上版本的GoogleTest/GoogleMock依赖
- 编译器支持C++11及以上标准
全量可复制代码
#include <iostream> #include <string> #include <gtest/gtest.h> #include <gmock/gmock.h> // 定义依赖的抽象接口,解耦核心逻辑与具体实现 class IStorage { public: virtual ~IStorage() = default; virtual bool Write(const std::string& data) = 0; }; // 生产环境下的真实依赖实现 class LocalFileStorage : public IStorage { public: bool Write(const std::string& data) override { // 实际生产逻辑:将数据写入本地持久化存储 std::cout << "Real storage write content: " << data << std::endl; return true; } }; // GoogleMock实现的Mock依赖 class MockStorage : public IStorage { public: MOCK_METHOD(bool, Write, (const std::string& data), (override)); }; // 核心业务类:通过构造函数注入抽象依赖,不硬编码具体实现 class OrderService { private: IStorage* storage_; // 持有抽象接口指针,完成依赖解耦 public: explicit OrderService(IStorage* storage) : storage_(storage) {} // 核心业务逻辑:处理订单并触发存储操作 bool ProcessOrder(const std::string& order_id) { if (order_id.empty()) { return false; } std::string save_content = "Order:" + order_id; return storage_->Write(save_content); } }; // 测试用例:使用Mock依赖验证核心业务逻辑 TEST(OrderServiceTest, ProcessOrderSuccessWhenStorageWriteOk) { MockStorage mock_storage; // 定义Mock预期:收到对应内容时返回写入成功 EXPECT_CALL(mock_storage, Write("Order:123")) .WillOnce(testing::Return(true)); OrderService service(&mock_storage); bool result = service.ProcessOrder("123"); EXPECT_TRUE(result); } TEST(OrderServiceTest, ProcessOrderSkipStorageWhenOrderIdEmpty) { MockStorage mock_storage; // 空订单ID场景下,存储方法不应被调用 EXPECT_CALL(mock_storage, Write(testing::_)) .Times(0); OrderService service(&mock_storage); bool result = service.ProcessOrder(""); EXPECT_FALSE(result); } int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
运行步骤
- 将上述完整代码保存为
mock_di_demo.cpp文件 - 执行编译命令:
g++ -std=c++11 mock_di_demo.cpp -o mock_demo -lgtest -lgmock -lpthread - 运行生成的可执行程序:
./mock_demo,即可看到全部测试用例通过的输出
实现逻辑说明
- 依赖注入核心逻辑:核心业务类
OrderService不内部实例化具体的LocalFileStorage实现,而是通过构造函数接收抽象接口IStorage的实例;生产环境可传入真实存储实现,测试环境可传入Mock实现,彻底实现逻辑与依赖的解耦 - GoogleMock适配逻辑:通过继承抽象依赖接口,使用
MOCK_METHOD宏定义可模拟的方法,通过EXPECT_CALL定义方法的匹配规则、返回值、调用次数,无需依赖真实的外部组件即可完成全分支逻辑测试 - 代码完整性:所有头文件引入、接口定义、真实依赖实现、Mock类实现、核心业务逻辑、测试用例、程序入口全部整合在单文件中,无需额外拼接零散代码即可直接编译运行
内容的提问来源于stack exchange,提问作者Ingo
相关产品推荐
相关产品推荐

