跳到主要内容
版本:7.0.3

明确期望值

Hunyuan 7b 中英对照 Defining Expectations

你可以通过在执行请求后附加一个或多个 EXPECT(..) 调用来定义预期,如下例所示。一旦有一个预期失败,其他预期将不会被验证。

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

mockMvc.perform(get("/accounts/1")).andExpect(status().isOk());

你可以通过在执行请求后附加andExpectAll(..)来定义多个预期,如下例所示。与andExpect(..)不同,andExpectAll(..)保证所有提供的预期都会被验证,并且所有的失败都会被跟踪和报告。

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

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

MockMvcResultMatchers.* 提供了多种预期(expectations),其中一些预期还进一步嵌套了更详细的子预期。

预期可以分为两大类。第一类断言用于验证响应的属性(例如,响应状态码、头部信息和内容)。这些是需要验证的最重要的结果。

第二类断言超出了响应的范围。这些断言允许你检查Spring MVC的特定方面,例如哪个控制器方法处理了请求、是否抛出并处理了异常、模型的内容是什么、选择了哪个视图、添加了哪些flash属性等等。它们还允许你检查Servlet的特定方面,例如请求和会话属性。

以下测试断言绑定或验证失败:

mockMvc.perform(post("/persons"))
.andExpect(status().isOk())
.andExpect(model().attributeHasErrors("person"));

很多时候,在编写测试时,将所执行请求的结果输出出来会非常有用。你可以按照以下方法来操作,其中print()是从MockMvcResultHandlers中静态导入的函数:

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

只要请求处理不会引发未处理的异常,print() 方法就会将所有可用的结果数据打印到 System.out。还有一个 log() 方法以及 print() 方法的两种变体,一种接受 OutputStream,另一种接受 Writer。例如,调用 print(System.err) 会将结果数据打印到 System.err,而调用 print(myWriter) 会将结果数据打印到一个自定义的写入器中。如果你希望将结果数据记录到日志中而不是打印出来,可以调用 log() 方法,该方法会将结果数据作为一条 DEBUG 级别的日志记录在 org.springframework.test.web.servlet.result 日志类别下。

在某些情况下,你可能希望直接获取结果并验证那些无法通过其他方式验证的内容。可以通过在所有其他预期处理之后附加.andReturn()来实现这一点,如下例所示:

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

如果所有测试都遵循相同的预期结果,那么在构建MockMvc实例时,你只需设置一次这些通用预期即可,如下例所示:

standaloneSetup(new SimpleController())
.alwaysExpect(status().isOk())
.alwaysExpect(content().contentType("application/json;charset=UTF-8"))
.build()

请注意,总是会应用常见的预期(common expectations),如果不创建一个单独的 MockMvc 实例,就无法覆盖这些预期。

当JSON响应内容包含使用Spring HATEOAS创建的超媒体链接时,你可以使用JsonPath表达式来验证这些链接,如下例所示:

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

当XML响应内容包含使用Spring HATEOAS创建的超媒体链接时,你可以使用XPath表达式来验证这些链接:

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