|
此版本仍在开发中,尚未稳定。如需最新的稳定版本,请使用 Spring Framework 7.0.6! |
定义预期
断言的工作方式与任何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")
请求也可能意外失败,即处理器抛出的异常没有被处理并直接抛出。您仍然可以使用.hasFailed()和.failure(),但尝试访问结果的任何部分都将抛出异常,因为交换尚未完成。
JSON 支持
AssertJ为MvcTestResult提供的支持通过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 的实现。