定義期望
斷言的工作方式與任何 AssertJ 斷言相同。此支援為 MvcTestResult 的各個部分提供了專用的斷言物件,如以下示例所示
-
Java
-
Kotlin
assertThat(mockMvc.get().uri("/hotels/{id}", 42))
.hasStatusOk()
.hasContentTypeCompatibleWith(MediaType.APPLICATION_JSON)
.bodyJson().isLenientlyEqualTo("sample/hotel-42.json");
assertThat(mockMvc.get().uri("/hotels/{id}", 42))
.hasStatusOk()
.hasContentTypeCompatibleWith(MediaType.APPLICATION_JSON)
.bodyJson().isLenientlyEqualTo("sample/hotel-42.json")
如果請求失敗,交換不會丟擲異常。相反,您可以斷言交換的結果已失敗
-
Java
-
Kotlin
assertThat(mockMvc.get().uri("/hotels/{id}", -1))
.hasFailed()
.hasStatus(HttpStatus.BAD_REQUEST)
.failure().hasMessageContaining("Identifier should be positive");
assertThat(mockMvc.get().uri("/hotels/{id}", -1))
.hasFailed()
.hasStatus(HttpStatus.BAD_REQUEST)
.failure().hasMessageContaining("Identifier should be positive")
請求也可能意外失敗,即處理程式丟擲的異常未被處理並按原樣丟擲。您仍然可以使用 .hasFailed() 和 .failure(),但任何嘗試訪問結果一部分的操作都將丟擲異常,因為交換尚未完成。
JSON 支援
MvcTestResult 的 AssertJ 支援透過 bodyJson() 提供 JSON 支援。
如果 JSONPath 可用,您可以在 JSON 文件上應用表示式。返回的值提供了便捷的方法,可以為各種支援的 JSON 資料型別返回專用的斷言物件
-
Java
-
Kotlin
assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members[0]")
.asMap()
.contains(entry("name", "Homer"));
assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members[0]")
.asMap()
.contains(entry("name", "Homer"))
您還可以將原始內容轉換為任何資料型別,只要訊息轉換器配置正確
-
Java
-
Kotlin
assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members[0]")
.convertTo(Member.class)
.satisfies(member -> assertThat(member.name).isEqualTo("Homer"));
assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members[0]")
.convertTo(Member::class.java)
.satisfies(ThrowingConsumer { member: Member ->
assertThat(member.name).isEqualTo("Homer")
})
轉換為目標 Class 提供了一個通用斷言物件。對於更復雜的型別,您可能希望使用 AssertFactory 來返回專用的斷言型別(如果可能)
-
Java
-
Kotlin
assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members")
.convertTo(InstanceOfAssertFactories.list(Member.class))
.hasSize(5)
.element(0).satisfies(member -> assertThat(member.name).isEqualTo("Homer"));
assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members")
.convertTo(InstanceOfAssertFactories.list(Member::class.java))
.hasSize(5)
.element(0).satisfies(ThrowingConsumer { member: Member ->
assertThat(member.name).isEqualTo("Homer")
})
JSONAssert 也受支援。響應正文可以與 Resource 或內容匹配。如果內容以 `.json ` 結尾,我們將在類路徑上查詢與該名稱匹配的檔案
-
Java
-
Kotlin
assertThat(mockMvc.get().uri("/family")).bodyJson()
.isStrictlyEqualTo("sample/simpsons.json");
assertThat(mockMvc.get().uri("/family")).bodyJson()
.isStrictlyEqualTo("sample/simpsons.json")
如果您更喜歡使用其他庫,可以提供 JsonComparator 的實現。