定义期望

断言的使用方式与任何 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")

如果请求失败,exchange 不会抛出异常。相反,您可以断言 exchange 的结果已失败。

  • 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")

请求也可能意外失败,即 handler 抛出的异常未经处理而直接抛出。您仍然可以使用 .hasFailed().failure(),但由于 exchange 未完成,任何访问结果一部分的尝试都将抛出异常。

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` 结尾,我们会在 classpath 中查找同名文件。

  • Java

  • Kotlin

assertThat(mockMvc.get().uri("/family")).bodyJson()
		.isStrictlyEqualTo("sample/simpsons.json");
assertThat(mockMvc.get().uri("/family")).bodyJson()
	.isStrictlyEqualTo("sample/simpsons.json")

如果您倾向于使用其他库,可以提供一个 JsonComparator 的实现。