跳到主要内容
版本:7.0.3

执行请求

Hunyuan 7b 中英对照 Performing Requests

本节将介绍如何单独使用MockMvc来执行请求并验证响应。如果通过WebTestClient使用MockMvc,请参阅编写测试中的相应章节。

要执行使用任何HTTP方法的请求,如下例所示:

// static import of MockMvcRequestBuilders.*

mockMvc.perform(post("/hotels/{id}", 42).accept(MediaType.APPLICATION_JSON));

你也可以执行文件上传请求,这些请求在内部使用MockMultipartHttpServletRequest,这样就无需实际解析multipart请求了。相反,你需要将其设置得类似于以下示例:

mockMvc.perform(multipart("/doc").file("a1", "ABC".getBytes("UTF-8")));

你可以像下面的例子所示,以URI模板的方式指定查询参数:

mockMvc.perform(get("/hotels?thing={thing}", "somewhere"));

你还可以添加表示查询参数或表单参数的Servlet请求参数,如下例所示:

mockMvc.perform(get("/hotels").param("thing", "somewhere"));

如果应用程序代码依赖于Servlet请求参数,并且没有显式检查查询字符串(这通常是大多数情况下的做法),那么你使用哪种选项其实并不重要。不过需要记住的是,通过URI模板提供的查询参数会被解码,而通过param(…)方法提供的请求参数则预期已经是解码状态了。

在大多数情况下,最好将上下文路径(context path)和Servlet路径(Servlet path)从请求URI中省略。如果你必须使用完整的请求URI进行测试,请务必相应地设置contextPathservletPath,以确保请求映射能够正常工作,如下例所示:

mockMvc.perform(get("/app/main/hotels/{id}").contextPath("/app").servletPath("/main"))

在前面的例子中,每次请求时都设置contextPathservletPath会显得很繁琐。相反,你可以设置默认的请求属性,如下例所示:

class MyWebTests {

MockMvc mockMvc;

@BeforeEach
void setup() {
mockMvc = standaloneSetup(new AccountController())
.defaultRequest(get("/")
.contextPath("/app").servletPath("/main")
.accept(MediaType.APPLICATION_JSON)).build();
}
}

上述属性会影响通过MockMvc实例执行的每个请求。如果在某个特定请求中还指定了相同的属性,那么该属性的值将覆盖默认值。这就是为什么在默认请求中的HTTP方法和URI并不重要,因为每个请求都必须明确指定这些内容。