Java 单元测试中 JSON 相关的测试案例

embedded/2024/12/25 7:07:30/

Java 单元测试中 JSON 相关的测试案例

在 Java 单元测试中,处理 JSON 数据的场景非常常见,通常包括生成 JSON 数据、解析 JSON 数据,以及验证其内容是否符合预期。以下详细讲解相关的测试用例、工具和实现方法。


1. 常用 JSON 库

在 Java 中,处理 JSON 的流行库包括:

  • Jackson:功能强大,支持序列化/反序列化。
  • Gson:轻量级,简单易用。
  • org.json:基础功能库,处理 JSON 数据直接而高效。

2. 测试 JSON 的生成

2.1 使用 Jackson 生成 JSON

Jackson 的 ObjectMapper 是一个核心类,用于将对象转换为 JSON。

测试用例示例:
java">import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;import java.util.HashMap;
import java.util.Map;import static org.junit.jupiter.api.Assertions.*;class JsonGenerationTest {@Testvoid testGenerateJsonWithJackson() throws Exception {ObjectMapper objectMapper = new ObjectMapper();// 构建测试数据Map<String, Object> data = new HashMap<>();data.put("name", "John");data.put("age", 30);data.put("active", true);// 生成 JSONString json = objectMapper.writeValueAsString(data);// 断言生成的 JSON 是否符合预期assertEquals("{\"name\":\"John\",\"age\":30,\"active\":true}", json);}
}
输出 JSON:
json">{"name":"John","age":30,"active":true}

2.2 使用 Gson 生成 JSON

Gson 的 Gson 类可以直接将对象序列化为 JSON。

测试用例示例:
java">import com.google.gson.Gson;
import org.junit.jupiter.api.Test;import java.util.HashMap;
import java.util.Map;import static org.junit.jupiter.api.Assertions.*;class JsonGenerationTest {@Testvoid testGenerateJsonWithGson() {Gson gson = new Gson();// 构建测试数据Map<String, Object> data = new HashMap<>();data.put("name", "Jane");data.put("age", 25);data.put("verified", false);// 生成 JSONString json = gson.toJson(data);// 断言生成的 JSON 是否符合预期assertEquals("{\"name\":\"Jane\",\"age\":25,\"verified\":false}", json);}
}
输出 JSON:
json">{"name":"Jane","age":25,"verified":false}

json_99">2.3 手动构建 JSON(使用 org.json

使用 JSONObject 构建 JSON 手动但灵活。

测试用例示例:
java">import org.json.JSONObject;
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;class JsonGenerationTest {@Testvoid testGenerateJsonWithOrgJson() {// 手动构建 JSONJSONObject jsonObject = new JSONObject();jsonObject.put("title", "Developer");jsonObject.put("salary", 75000);String json = jsonObject.toString();// 断言生成的 JSON 是否符合预期assertEquals("{\"title\":\"Developer\",\"salary\":75000}", json);}
}
输出 JSON:
json">{"title":"Developer","salary":75000}

3. 测试 JSON 的解析

3.1 使用 Jackson 解析 JSON

ObjectMapper 提供了从 JSON 字符串解析为 Java 对象的功能。

测试用例示例:
java">import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;import java.util.Map;import static org.junit.jupiter.api.Assertions.*;class JsonParsingTest {@Testvoid testParseJsonWithJackson() throws Exception {String json = "{\"name\":\"Alice\",\"age\":28}";ObjectMapper objectMapper = new ObjectMapper();// 解析 JSONMap<String, Object> data = objectMapper.readValue(json, Map.class);// 验证解析结果assertEquals("Alice", data.get("name"));assertEquals(28, data.get("age"));}
}

3.2 使用 Gson 解析 JSON

Gson 的 fromJson 方法用于将 JSON 转换为 Java 对象。

测试用例示例:
java">import com.google.gson.Gson;
import org.junit.jupiter.api.Test;import java.util.Map;import static org.junit.jupiter.api.Assertions.*;class JsonParsingTest {@Testvoid testParseJsonWithGson() {String json = "{\"product\":\"Laptop\",\"price\":1200}";Gson gson = new Gson();// 解析 JSONMap<String, Object> data = gson.fromJson(json, Map.class);// 验证解析结果assertEquals("Laptop", data.get("product"));assertEquals(1200.0, data.get("price")); // Gson 默认将数字解析为 Double}
}

json__JSON_199">3.3 使用 org.json 解析 JSON

JSONObject 可以直接解析 JSON 字符串并访问数据。

测试用例示例:
java">import org.json.JSONObject;
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;class JsonParsingTest {@Testvoid testParseJsonWithOrgJson() {String json = "{\"city\":\"New York\",\"population\":8419600}";// 解析 JSONJSONObject jsonObject = new JSONObject(json);// 验证解析结果assertEquals("New York", jsonObject.getString("city"));assertEquals(8419600, jsonObject.getInt("population"));}
}

4. 验证 JSON 的内容

4.1 使用断言验证 JSON

无论生成还是解析后的 JSON,可以通过断言验证其内容。

验证结构示例:
  • 使用 Jackson
java">@Test
void testJsonStructureWithJackson() throws Exception {String json = "{\"status\":\"success\",\"data\":{\"id\":1}}";ObjectMapper objectMapper = new ObjectMapper();Map<String, Object> parsedJson = objectMapper.readValue(json, Map.class);assertEquals("success", parsedJson.get("status"));assertTrue(parsedJson.containsKey("data"));
}
java">@Test
void testJsonStructureWithOrgJson() {String json = "{\"status\":\"success\",\"data\":{\"id\":1}}";JSONObject jsonObject = new JSONObject(json);assertEquals("success", jsonObject.getString("status"));assertTrue(jsonObject.has("data"));
}

4.2 JSON Schema 验证

借助库(如 everit-org/json-schema),可以验证 JSON 是否符合 Schema。

示例:
java">@Test
void testJsonSchemaValidation() {String schemaJson = "{ \"type\": \"object\", \"properties\": { \"id\": { \"type\": \"integer\" }, \"name\": { \"type\": \"string\" } }, \"required\": [\"id\", \"name\"] }";String jsonToValidate = "{ \"id\": 1, \"name\": \"John\" }";JSONObject rawSchema = new JSONObject(schemaJson);Schema schema = SchemaLoader.load(rawSchema);assertDoesNotThrow(() -> schema.validate(new JSONObject(jsonToValidate)));
}

5. 总结

  1. 生成 JSON
    • 使用 Jackson、Gson 或 org.json 构建 JSON 数据。
  2. 解析 JSON
    • 使用 Jackson 的 ObjectMapper 或 Gson 的 fromJson 方法解析 JSON。
  3. 验证 JSON
    • 通过断言检查 JSON 的内容。
    • 结合 JSON Schema 验证 JSON 的结构。

JSON 的生成、解析和验证是测试中不可或缺的环节,通过灵活运用这些工具,可以简化测试流程,提高测试覆盖率和可靠性。


http://www.ppmy.cn/embedded/148262.html

相关文章

dolphinscheduler服务注册中心源码解析(三)RPC提供者服务整合注册中心注册服务实现源码

RPC提供者服务整合注册中心注册服务实现源码 1.概述2.源码解读思路3.实现2.1.应用服务的RPC服务接口定义2.1.1.MasterServer应用中提供的RPC接口服务2.1.2.WorkerServer应用中提供的RPC接口服务2.2.应用服务的RPC服务接口实现2.2.1.MasterServer应用中提供的RPC接口服务实现类2…

使用Python实现智能家居控制系统:开启智慧生活的钥匙

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…

SpringBoot的Thymeleaf做一个可自定义合并td的pdf表格

需求背景 项目开发过程中 有需要生成pdf的需求 这种需求内可能会存在使用表格去展示一些数据给用户 使其更明显直观的对比数据 这时候会存在一个项目或者仪器对应了多个单子 这就用到了table的td合并 样例展示 类似例子中pdf生成出来的图表 第一个项目有多个批号 这时候…

JAVA服务器端发送邮件问题 Could not connect to SMTP host

写在前面 在开发过程中&#xff0c;发送邮件经过本地测试是没有问题&#xff0c;部署到服务器上后&#xff0c;发送邮件一直报 Could not connect to SMTP host : smtp.yeah.net, port: 465 解决方法 网上各种解决方案&#xff0c;都试了一遍都未能解决这个报错问题&#xf…

三相电原理

首先从一个交流发电机看 下图为电机内部的横截面图。中间为永磁体转子 我们拿一根铜线&#xff0c;如图所示绕成两个线圈&#xff0c;形成闭合回路 接下来让中心永磁体转动。线圈内部的自由电子受到磁场变化的干扰产生感应电流。 磁场线的分布是一个双椭圆。由于磁场线越密集的…

谷歌集群数据集:负载均衡云服务测试数据

谷歌集群数据集 以下为你举例说明各文件中一条数据的具体含义,方便你更好地理解这个数据集: 1. machine_events 文件示例 假设其中有这样一条数据:123456789, 101, 0, "platform_abc", 4, 8 含义:表示在时间戳为123456789微秒时,机器ID为101的这台机器发生了…

smb和nfs双栈协议共享目录

1 简介 NFS和SAMBA协议都是文件共享&#xff0c;Linux客户端常用于NFS协议访问远程共享目录&#xff0c;Windows客户端常用于SAMBA协议访问远程共享目录。 2 环境 合计使用三台服务器&#xff0c;服务器都位于同一个子网&#xff08;10.0.0.0/19&#xff09;、同一个安全组…

CSS系列(24)-- 打印样式详解

前端技术探索系列&#xff1a;CSS 打印样式详解 &#x1f5a8;️ 致读者&#xff1a;探索打印样式的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS 打印样式&#xff0c;学习如何优化网页的打印体验。 打印样式基础 &#x1f680; 媒体查询 /* 打…