You need to enable JavaScript to run this app. 寻求基于Googlemock实现依赖注入与mock的可复制运行完整代码示例
优惠活动
大模型
产品
解决方案
定价
更多

寻求基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 00:57:10