如何用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
相关产品推荐
相关产品推荐

