本部分介绍如何单独使用 MockMvc 来执行请求和验证响应。
如果通过 MockMvc 使用 MockMvc,请参阅编写测试的相应部分。WebTestClient
执行使用任何 HTTP 方法的请求,如以下示例所示:
-
Java
-
Kotlin
// static import of MockMvcRequestBuilders.*
mockMvc.perform(post("/hotels/{id}", 42).accept(MediaType.APPLICATION_JSON));
import org.springframework.test.web.servlet.post
mockMvc.post("/hotels/{id}", 42) {
accept = MediaType.APPLICATION_JSON
}
您还可以执行内部使用的文件上传请求,以便不会对分段进行实际解析
请求。相反,您必须将其设置为类似于以下示例:MockMultipartHttpServletRequest
-
Java
-
Kotlin
mockMvc.perform(multipart("/doc").file("a1", "ABC".getBytes("UTF-8")));
import org.springframework.test.web.servlet.multipart
mockMvc.multipart("/doc") {
file("a1", "ABC".toByteArray(charset("UTF8")))
}
可以在 URI 模板样式中指定查询参数,如以下示例所示:
-
Java
-
Kotlin
mockMvc.perform(get("/hotels?thing={thing}", "somewhere"));
mockMvc.get("/hotels?thing={thing}", "somewhere")
您还可以添加表示查询或表单的 Servlet 请求参数 参数,如以下示例所示:
-
Java
-
Kotlin
mockMvc.perform(get("/hotels").param("thing", "somewhere"));
import org.springframework.test.web.servlet.get
mockMvc.get("/hotels") {
param("thing", "somewhere")
}
如果应用程序代码依赖于 Servlet 请求参数并且不检查查询
显式字符串(最常见的情况是),使用哪个选项并不重要。
但是,请记住,随 URI 模板提供的查询参数是解码的
而通过该方法提供的请求参数预计已经
被解码。param(…)
在大多数情况下,最好将上下文路径和 Servlet 路径保留在
请求 URI。如果必须使用完整的请求 URI 进行测试,请务必相应地设置 and,以便请求映射正常工作,如以下示例所示
显示:contextPath
servletPath
-
Java
-
Kotlin
mockMvc.perform(get("/app/main/hotels/{id}").contextPath("/app").servletPath("/main"))
import org.springframework.test.web.servlet.get
mockMvc.get("/app/main/hotels/{id}") {
contextPath = "/app"
servletPath = "/main"
}
在前面的示例中,为每个执行的请求设置 and 会很麻烦。相反,您可以设置默认请求
属性,如以下示例所示:contextPath
servletPath
-
Java
-
Kotlin
class MyWebTests {
MockMvc mockMvc;
@BeforeEach
void setup() {
mockMvc = standaloneSetup(new AccountController())
.defaultRequest(get("/")
.contextPath("/app").servletPath("/main")
.accept(MediaType.APPLICATION_JSON)).build();
}
}
// Not possible in Kotlin until {kotlin-issues}/KT-22208 is fixed
上述属性会影响通过实例执行的每个请求。
如果在给定请求上也指定了相同的属性,则它将覆盖默认值
价值。这就是为什么默认请求中的 HTTP 方法和 URI 无关紧要的原因,因为
必须在每个请求中指定它们。MockMvc