在之前的測試文章中,我們使用的 JSON 驗證方法都是透過 jsonPath()
來進行驗證
本文將介紹三種優雅且強大的 JSON 驗證方法,這些方法不僅能提高測試的可讀性,還能增強測試的可靠性
讓我們一起來看看如何運用這些技巧來改善我們的測試程式碼吧!
content().json()
進行直觀的 JSON 比對Spring Boot 的 MockMvc 提供了一個非常直觀的方法來驗證 JSON 回應:content().json()
這個方法允許我們直接比對整個 JSON 結構,無需逐一檢查每個欄位
mockMvc.perform(get("/api/todos/1"))
.andExpect(status().isOk())
.andExpect(content().json("""
{
"success": true,
"data" : {
"id" : 1,
"title" : "測試待辦事項",
"completed" : false
}
}
"""
));
這種方法的優點是:
jsonPath()
JSONAssert
進行精確的 JSON 比對JSONAssert
是一個強大的 JSON 驗證 package,它提供了更細緻的 JSON 比對功能
使用之前,需要先引入 JSONAssert
的套件
// https://mvnrepository.com/artifact/org.skyscreamer/jsonassert
testImplementation 'org.skyscreamer:jsonassert:1.5.3'
使用 JSONAssert
,我們可以進行嚴格模式的比對,確保 JSON 的每個細節都完全符合預期
var result = mockMvc.perform(get("/api/todos/1"))
.andReturn().getResponse().getContentAsString(StandardCharsets.UTF_8);
JSONAssert.assertEquals("""
{
"success": true,
"data" : {
"id" : 1,
"title" : "測試待辦事項",
"completed" : false
},
"error" : null
}
""", result, true);
這種方法的優點包括:
這種方法將 JSON 轉換為 Java 物件,然後使用 AssertJ
等驗證庫進行物件比對
這種方法特別適合於需要進行複雜邏輯驗證的場景
var apiResult = objectMapper.readValue(result, new TypeReference<MyApiResponse<Todo>>() {});
assertThat(apiResult.isSuccess()).isTrue();
var expected = new Todo(1L, "測試待辦事項", false);
assertThat(apiResult.getData()).usingRecursiveComparison().isEqualTo(expected);
這種方法的優點是:
上面的講解只有列出部份的程式碼,完整的程式碼可以參考 Github commit
為什麼這些方法比原先的方法更好?
content().json()
和 JSONAssert
方法,它們提供了更直觀的 JSON 結構視圖,使得測試程式碼更易於理解和維護。jsonPath()
驗證,而新方法可以一次性驗證整個 JSON 結構。JSONAssert
提供了嚴格模式的比對,可以捕捉到細微的 JSON 差異。而物件比對方法則允許進行更複雜的邏輯驗證。JSONAssert
,它提供了詳細的錯誤訊息,幫助開發者快速定位問題。透過採用這些方法,我們可以寫出更簡潔、更可靠、更易維護的測試程式碼
在實際開發中,可以根據具體需求選擇最適合的方法,甚至組合使用這些方法來達到最佳的測試效果
同步刊登於 iTHome 鐵人賽 「Spring Boot API 開發:從 0 到 1」Day 32.5 Spring Boot 測試進化:三種優雅的 JSON 驗證方法
我的粉絲專頁
圖片來源:AI 產生