跳到主要内容
版本:7.0.3

明确期望值

Hunyuan 7b 中英对照 Defining Expectations

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

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

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

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数据类型返回一个专门的断言对象:

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

只要消息转换器配置正确,您还可以将原始内容转换为任何您所需的数据类型:

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

转换为目标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"));

JSONAssert也得到支持。响应的主体可以与一个Resource或内容进行匹配。如果内容以\.json结尾,我们会在类路径(classpath)中查找名称匹配的文件:

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

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