リクエストの実行
このセクションでは、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
を使用するファイルアップロードリクエストを実行して、マルチパートリクエストの実際の解析が行われないようにすることもできます。むしろ、次の例のように設定する必要があります。
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")
次の例に示すように、クエリまたはフォームパラメーターを表すサーブレットリクエストパラメーターを追加することもできます。
Java
Kotlin
mockMvc.perform(get("/hotels").param("thing", "somewhere"));
import org.springframework.test.web.servlet.get
mockMvc.get("/hotels") {
param("thing", "somewhere")
}
アプリケーションコードがサーブレットリクエストパラメーターに依存しており、クエリ文字列を明示的にチェックしない場合(ほとんどの場合)、使用するオプションは関係ありません。ただし、URI テンプレートで提供されるクエリパラメーターはデコードされますが、param(…)
メソッドを介して提供されるリクエストパラメーターはすでにデコードされていることが予想されます。
ほとんどの場合、コンテキスト URI とサーブレットパスはリクエスト 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 は重要ではありません。リクエストごとに指定する必要があるためです。