執行請求
本節介紹如何單獨使用 MockMvc 執行請求並驗證響應。如果透過 `WebTestClient` 使用 MockMvc,請參閱關於編寫測試的相應章節。
要執行使用任何 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` 的檔案上傳請求,這樣就不會實際解析 multipart 請求。你需要進行如下設定,使其類似於以下示例
-
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(…)` 方法提供的請求引數則預期已經解碼。
在大多數情況下,最好將 context path 和 Servlet path 從請求 URI 中排除。如果你必須使用完整的請求 URI 進行測試,請確保相應地設定 `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"
}
在上面的示例中,在每次執行請求時都設定 `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
上述屬性會影響透過 `MockMvc` 例項執行的每個請求。如果在給定請求上也指定了相同的屬性,則會覆蓋預設值。這就是預設請求中的 HTTP 方法和 URI 無關緊要的原因,因為它們必須在每個請求中指定。