Java 单元测试中 JSON 相关的测试案例
在 Java 单元测试中,处理 JSON 数据的场景非常常见,通常包括生成 JSON 数据、解析 JSON 数据,以及验证其内容是否符合预期。以下详细讲解相关的测试用例、工具和实现方法。
1. 常用 JSON 库
在 Java 中,处理 JSON 的流行库包括:
- Jackson:功能强大,支持序列化/反序列化。
- Gson:轻量级,简单易用。
- org.json:基础功能库,处理 JSON 数据直接而高效。
2. 测试 JSON 的生成
2.1 使用 Jackson 生成 JSON
Jackson 的 ObjectMapper
是一个核心类,用于将对象转换为 JSON。
测试用例示例:
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 {
@Test
void 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);
// 生成 JSON
String json = objectMapper.writeValueAsString(data);
// 断言生成的 JSON 是否符合预期
assertEquals("{\"name\":\"John\",\"age\":30,\"active\":true}", json);
}
}
输出 JSON:
{"name":"John","age":30,"active":true}
2.2 使用 Gson 生成 JSON
Gson 的 Gson
类可以直接将对象序列化为 JSON。
测试用例示例:
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 {
@Test
void testGenerateJsonWithGson() {
Gson gson = new Gson();
// 构建测试数据
Map<String, Object> data = new HashMap<>();
data.put("name", "Jane");
data.put("age", 25);
data.put("verified", false);
// 生成 JSON
String json = gson.toJson(data);
// 断言生成的 JSON 是否符合预期
assertEquals("{\"name\":\"Jane\",\"age\":25,\"verified\":false}", json);
}
}
输出 JSON:
{"name":"Jane","age":25,"verified":false}
2.3 手动构建 JSON(使用 org.json)
使用 JSONObject
构建 JSON 手动但灵活。
测试用例示例:
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class JsonGenerationTest {
@Test
void testGenerateJsonWithOrgJson() {
// 手动构建 JSON
JSONObject jsonObject = new JSONObject();
jsonObject.put("title", "Developer");
jsonObject.put("salary", 75000);
String json = jsonObject.toString();
// 断言生成的 JSON 是否符合预期
assertEquals("{\"title\":\"Developer\",\"salary\":75000}", json);
}
}
输出 JSON:
{"title":"Developer","salary":75000}
3. 测试 JSON 的解析
3.1 使用 Jackson 解析 JSON
ObjectMapper
提供了从 JSON 字符串解析为 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 {
@Test
void testParseJsonWithJackson() throws Exception {
String json = "{\"name\":\"Alice\",\"age\":28}";
ObjectMapper objectMapper = new ObjectMapper();
// 解析 JSON
Map<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 对象。
测试用例示例:
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.*;
class JsonParsingTest {
@Test
void testParseJsonWithGson() {
String json = "{\"product\":\"Laptop\",\"price\":1200}";
Gson gson = new Gson();
// 解析 JSON
Map<String, Object> data = gson.fromJson(json, Map.class);
// 验证解析结果
assertEquals("Laptop", data.get("product"));
assertEquals(1200.0, data.get("price")); // Gson 默认将数字解析为 Double
}
}
3.3 使用 org.json 解析 JSON
JSONObject
可以直接解析 JSON 字符串并访问数据。
测试用例示例:
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class JsonParsingTest {
@Test
void testParseJsonWithOrgJson() {
String json = "{\"city\":\"New York\",\"population\":8419600}";
// 解析 JSON
JSONObject jsonObject = new JSONObject(json);
// 验证解析结果
assertEquals("New York", jsonObject.getString("city"));
assertEquals(8419600, jsonObject.getInt("population"));
}
}
4. 验证 JSON 的内容
4.1 使用断言验证 JSON
无论生成还是解析后的 JSON,可以通过断言验证其内容。
验证结构示例:
- 使用 Jackson:
@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"));
}
- 使用 org.json:
@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。
示例:
@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. 总结
- 生成 JSON:
- 使用 Jackson、Gson 或 org.json 构建 JSON 数据。
- 解析 JSON:
- 使用 Jackson 的
ObjectMapper
或 Gson 的fromJson
方法解析 JSON。
- 使用 Jackson 的
- 验证 JSON:
- 通过断言检查 JSON 的内容。
- 结合 JSON Schema 验证 JSON 的结构。
JSON 的生成、解析和验证是测试中不可或缺的环节,通过灵活运用这些工具,可以简化测试流程,提高测试覆盖率和可靠性。