Defining Expectations

断言的运作方式与任何 AssertJ 断言相同。该支持为 MvcTestResult 的各个部分提供了专用的断言对象,如下例所示: include-code::./HotelControllerTests[tag=get,indent=0] 如果请求失败,则该交换不会抛出异常。相反,你可以断言交换的结果失败: include-code::./HotelControllerTests[tag=failure,indent=0] 该请求也有可能意外失败,即处理程序抛出的异常未得到处理并按原样抛出。你仍然可以使用 .hasFailed().failure(),但任何尝试访问结果的一部分都会抛出一个例外,因为交换尚未完成。

JSON Support

MvcTestResult 的 AssertJ 支持通过 bodyJson() 提供 JSON 支持。

如果提供 JSONPath, 您可以针对 JSON 文档应用表达式。返回值提供了方便的方法来针对各种受支持的 JSON 数据类型返回一个专门的 Assert 对象:

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

如果您希望使用其他库,可以提供https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/json/JsonComparator.html[JsonComparator] 的一个实现。