对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cn

定义期望

您可以通过在以下位置附加一个或多个调用来定义预期 执行请求,如下例所示。一旦一个期望落空, 不会断言其他期望。andExpect(..)spring-doc.cn

// static import of MockMvcRequestBuilders.* and MockMvcResultMatchers.*

mockMvc.perform(get("/accounts/1")).andExpect(status().isOk());
import org.springframework.test.web.servlet.get

mockMvc.get("/accounts/1").andExpect {
	status { isOk() }
}

您可以通过在执行 请求,如下例所示。与 , 相反,保证所有提供的期望都将被断言,并且 将跟踪和报告所有失败。andExpectAll(..)andExpect(..)andExpectAll(..)spring-doc.cn

// static import of MockMvcRequestBuilders.* and MockMvcResultMatchers.*

mockMvc.perform(get("/accounts/1")).andExpectAll(
	status().isOk(),
	content().contentType("application/json;charset=UTF-8"));
import org.springframework.test.web.servlet.get

mockMvc.get("/accounts/1").andExpectAll {
	status { isOk() }
	content { contentType(APPLICATION_JSON) }
}

MockMvcResultMatchers.*提供了许多期望,其中一些是更进一步的 嵌套了更详细的期望。spring-doc.cn

期望分为两大类。第一类断言验证 响应的属性(例如,响应状态、标头和内容)。 这些是要断言的最重要的结果。spring-doc.cn

第二类断言超出了响应的范围。这些断言允许您 检查 Spring MVC 特定的方面,例如哪个控制器方法处理了 请求,是否引发并处理了异常,模型的内容是什么, 选择了什么视图,添加了哪些 Flash 属性,等等。他们还让您 检查 Servlet 特定的方面,比如 request 和 session 属性。spring-doc.cn

以下测试断言绑定或验证失败:spring-doc.cn

mockMvc.perform(post("/persons"))
	.andExpect(status().isOk())
	.andExpect(model().attributeHasErrors("person"));
import org.springframework.test.web.servlet.post

mockMvc.post("/persons").andExpect {
	status { isOk() }
	model {
		attributeHasErrors("person")
	}
}

很多时候,在编写测试时,转储执行的 请求。您可以按如下方式执行此操作,其中 is a static import from :print()MockMvcResultHandlersspring-doc.cn

mockMvc.perform(post("/persons"))
	.andDo(print())
	.andExpect(status().isOk())
	.andExpect(model().attributeHasErrors("person"));
import org.springframework.test.web.servlet.post

mockMvc.post("/persons").andDo {
		print()
	}.andExpect {
		status { isOk() }
		model {
			attributeHasErrors("person")
		}
	}

只要请求处理不会导致未处理的异常,该方法 将所有可用的结果数据打印到 。还有一个 method 和 该方法的两个其他变体,一个接受 和 一个接受 .例如,调用 会打印结果 data 复制到 ,而调用时将结果数据打印到自定义 作家。如果要记录结果数据而不是打印结果数据,可以调用该方法,该方法将结果数据记录为 logging 类别下的单个消息。print()System.outlog()print()OutputStreamWriterprint(System.err)System.errprint(myWriter)log()DEBUGorg.springframework.test.web.servlet.resultspring-doc.cn

在某些情况下,您可能希望直接访问结果并验证 否则无法验证。这可以通过在 其他期望,如下例所示:.andReturn()spring-doc.cn

MvcResult mvcResult = mockMvc.perform(post("/persons")).andExpect(status().isOk()).andReturn();
// ...
var mvcResult = mockMvc.post("/persons").andExpect { status { isOk() } }.andReturn()
// ...

如果所有测试都重复相同的期望值,则可以在以下情况下设置一次通用期望值 构建实例,如下例所示:MockMvcspring-doc.cn

standaloneSetup(new SimpleController())
	.alwaysExpect(status().isOk())
	.alwaysExpect(content().contentType("application/json;charset=UTF-8"))
	.build()
// Not possible in Kotlin until https://youtrack.jetbrains.com/issue/KT-22208 is fixed

请注意,通用期望始终适用,如果没有 创建单独的实例。MockMvcspring-doc.cn

当 JSON 响应内容包含使用 Spring HATEOAS 创建的超媒体链接时,您可以验证 使用 JsonPath 表达式生成的链接,如下例所示:spring-doc.cn

mockMvc.perform(get("/people").accept(MediaType.APPLICATION_JSON))
	.andExpect(jsonPath("$.links[?(@.rel == 'self')].href").value("http://localhost:8080/people"));
mockMvc.get("/people") {
	accept(MediaType.APPLICATION_JSON)
}.andExpect {
	jsonPath("$.links[?(@.rel == 'self')].href") {
		value("http://localhost:8080/people")
	}
}

当 XML 响应内容包含使用 Spring HATEOAS 创建的超媒体链接时,您可以验证 使用 XPath 表达式生成的链接:spring-doc.cn

Map<String, String> ns = Collections.singletonMap("ns", "http://www.w3.org/2005/Atom");
mockMvc.perform(get("/handle").accept(MediaType.APPLICATION_XML))
	.andExpect(xpath("/person/ns:link[@rel='self']/@href", ns).string("http://localhost:8080/people"));
val ns = mapOf("ns" to "http://www.w3.org/2005/Atom")
mockMvc.get("/handle") {
	accept(MediaType.APPLICATION_XML)
}.andExpect {
	xpath("/person/ns:link[@rel='self']/@href", ns) {
		string("http://localhost:8080/people")
	}
}