定義預期

斷言的工作方式與任何 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 也受到支援。可以將回應的 body 與 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 的實作。