リクエストの実行

このセクションでは、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 は重要ではありません。リクエストごとに指定する必要があるためです。