You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用gtest为返回nlohmann::json对象的C++函数编写单元测试

问题解答

首先明确结论:你当前的Mock思路不正确,这个场景不需要使用Mock测试

  • Mock的核心作用是模拟被测对象的外部依赖,避免依赖不稳定、耗时的操作影响测试逻辑。你当前的被测对象就是parse_json函数本身,如果你Mock这个函数,测试过程中执行的是Mock对象的假实现,完全不会调用真实的parse_json代码,等于没有测到你要验证的逻辑。

正确测试方案

nlohmann::json原生支持==运算符直接对比两个JSON对象是否完全相等,你可以直接用基础的GTEST断言即可,不需要额外适配:

步骤1:准备测试数据

提前准备好测试用的JSON文件,以及对应的预期JSON结构即可。比如我们准备测试文件test_valid.json,内容如下:

{
    "id": 1001,
    "username": "zhangsan",
    "is_active": true,
    "tags": ["c++", "gtest"]
}

步骤2:编写测试用例

#include <gtest/gtest.h>
#include <nlohmann/json.hpp>
// 记得引入你parse_json函数所在的头文件

TEST(ParseJsonTest, ReturnsCorrectJsonWhenFileValid) {
    // 构造预期的json对象
    nlohmann::json expected = {
        {"id", 1001},
        {"username", "zhangsan"},
        {"is_active", true},
        {"tags", {"c++", "gtest"}}
    };
    // 调用被测函数,替换为你实际的测试文件路径
    nlohmann::json actual = parse_json("./test_valid.json");
    // 直接断言两个json对象相等即可
    EXPECT_EQ(actual, expected);
}

// 补充异常场景测试覆盖边界
TEST(ParseJsonTest, ThrowsExceptionWhenFileNotExist) {
    // 传入不存在的文件路径,预期抛出异常
    EXPECT_THROW(parse_json("./non_exist.json"), std::exception);
}

TEST(ParseJsonTest, ThrowsExceptionWhenJsonInvalid) {
    // 提前准备内容非法的json文件(比如内容只有一个`{`)
    EXPECT_THROW(parse_json("./invalid_json.json"), nlohmann::json::parse_error);
}

什么时候需要用到Mock parse_json的逻辑?

只有当你要测试上层依赖parse_json的业务函数时,才需要Mock parse_json。比如你有个业务函数get_user_info内部会调用parse_json读取用户配置文件,你不想让测试过程真的读磁盘文件,这时候你可以把parse_json抽象为接口,通过依赖注入注入到业务函数中,再用Mock实现替换真实实现来模拟返回值,测试上层业务逻辑是否正确。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:06:04