定义期望

断言的工作方式与任何 AssertJ 断言相同。该支持提供专用的 assert 对象MvcTestResult,如下所示 例:spring-doc.cadn.net.cn

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 不会引发异常。相反,您可以断言 交换结果失败:spring-doc.cadn.net.cn

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()但是任何访问部分结果的尝试都会引发异常,因为 交换尚未完成。spring-doc.cadn.net.cn

JSON 支持

AssertJ 对MvcTestResult通过以下方式提供 JSON 支持bodyJson().spring-doc.cadn.net.cn

如果 JSONPath 可用,则可以应用表达式 在 JSON 文档上。返回的值提供了返回专用 assert 对象:spring-doc.cadn.net.cn

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

您还可以将原始内容转换为任何数据类型,只要消息 converter 配置正确:spring-doc.cadn.net.cn

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提供泛型 assert 对象。对于更复杂的类型, 您可能想要使用AssertFactory相反,它会返回一个专用的 assert 类型,如果 可能:spring-doc.cadn.net.cn

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。主体 response 可以与Resource或内容。如果内容以 '.json ' 我们在 Classpath 上查找与该名称匹配的文件:spring-doc.cadn.net.cn

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

如果您更喜欢使用其他库,则可以提供JsonComparator.spring-doc.cadn.net.cn