跳到主要内容

定义期望

DeepSeek V3 中英对照 Defining Expectations

断言的工作方式与任何 AssertJ 断言相同。支持为 MvcTestResult 的各个部分提供了专用的断言对象,如下例所示:

assertThat(mockMvc.get().uri("/hotels/{id}", 42))
.hasStatusOk()
.hasContentTypeCompatibleWith(MediaType.APPLICATION_JSON)
.bodyJson().isLenientlyEqualTo("sample/hotel-42.json");
java

如果请求失败,Exchange 不会抛出异常。相反,你可以断言 Exchange 的结果已经失败:

assertThat(mockMvc.get().uri("/hotels/{id}", -1))
.hasFailed()
.hasStatus(HttpStatus.BAD_REQUEST)
.failure().hasMessageContaining("Identifier should be positive");
java

请求也可能意外失败,即处理程序抛出的异常未被处理并直接抛出。你仍然可以使用 .hasFailed().failure(),但任何尝试访问结果部分的操作都会抛出异常,因为交换尚未完成。

JSON 支持

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

如果 JSONPath 可用,你可以在 JSON 文档上应用一个表达式。返回值提供了便捷的方法,用于返回针对各种支持的 JSON 数据类型的专用断言对象:

assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members[0]")
.asMap()
.contains(entry("name", "Homer"));
java

你也可以将原始内容转换为任何数据类型,只要消息转换器配置正确即可:

assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members[0]")
.convertTo(Member.class)
.satisfies(member -> assertThat(member.name).isEqualTo("Homer"));
java

转换为目标 Class 提供了一个通用的断言对象。对于更复杂的类型,如果可能的话,你可能希望使用 AssertFactory 来代替,它返回一个专用的断言类型:

assertThat(mockMvc.get().uri("/family")).bodyJson()
.extractingPath("$.members")
.convertTo(InstanceOfAssertFactories.list(Member.class))
.hasSize(5)
.element(0).satisfies(member -> assertThat(member.name).isEqualTo("Homer"));
java

JSONAssert 同样受到支持。响应的正文可以与 Resource 或内容进行匹配。如果内容以 .json 结尾,我们会在类路径上查找与该名称匹配的文件:

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

如果您更喜欢使用其他库,可以提供 JsonComparator 的实现。