diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/client/MockMvcHttpConnector.java b/spring-test/src/main/java/org/springframework/test/web/servlet/client/MockMvcHttpConnector.java index ba6b040b10..b4d07e814c 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/client/MockMvcHttpConnector.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/client/MockMvcHttpConnector.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -152,7 +152,7 @@ public class MockMvcHttpConnector implements ClientHttpConnector { } // Parse the multipart request in order to adapt to Servlet Part's - MockMultipartHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.multipart(uri); + MockMultipartHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.multipart(httpMethod, uri); Assert.notNull(bytes, "No multipart content"); ReactiveHttpInputMessage inputMessage = MockServerHttpRequest.post(uri.toString()) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMultipartHttpServletRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMultipartHttpServletRequestBuilder.java index 73a0a3bd29..3f2b59909b 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMultipartHttpServletRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMultipartHttpServletRequestBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,12 +69,8 @@ public class MockMultipartHttpServletRequestBuilder extends MockHttpServletReque } /** - * Package-private constructor. Use static factory methods in - * {@link MockMvcRequestBuilders}. - *
For other ways to initialize a {@code MockMultipartHttpServletRequest},
- * see {@link #with(RequestPostProcessor)} and the
- * {@link RequestPostProcessor} extension point.
- * @param uri the URL
+ * Variant of {@link #MockMultipartHttpServletRequestBuilder(String, Object...)}
+ * with a {@link URI}.
* @since 4.0.3
*/
MockMultipartHttpServletRequestBuilder(URI uri) {
@@ -82,6 +78,16 @@ public class MockMultipartHttpServletRequestBuilder extends MockHttpServletReque
super.contentType(MediaType.MULTIPART_FORM_DATA);
}
+ /**
+ * Variant of {@link #MockMultipartHttpServletRequestBuilder(String, Object...)}
+ * with a {@link URI} and an {@link HttpMethod}.
+ * @since 5.3.21
+ */
+ MockMultipartHttpServletRequestBuilder(HttpMethod httpMethod, URI uri) {
+ super(httpMethod, uri);
+ super.contentType(MediaType.MULTIPART_FORM_DATA);
+ }
+
/**
* Create a new MockMultipartFile with the given content.
diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java
index 068320216f..7334028daa 100644
--- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java
+++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2019 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -215,7 +215,7 @@ public abstract class MockMvcRequestBuilders {
}
/**
- * Create a {@link MockMultipartHttpServletRequestBuilder} for a multipart request.
+ * Variant of {@link #multipart(String, Object...)} with a {@link URI}.
* @param uri the URL
* @since 5.0
*/
@@ -223,6 +223,17 @@ public abstract class MockMvcRequestBuilders {
return new MockMultipartHttpServletRequestBuilder(uri);
}
+ /**
+ * Variant of {@link #multipart(String, Object...)} with a {@link URI} and
+ * an {@link HttpMethod}.
+ * @param httpMethod the HTTP method to use
+ * @param uri the URL
+ * @since 5.3.21
+ */
+ public static MockMultipartHttpServletRequestBuilder multipart(HttpMethod httpMethod, URI uri) {
+ return new MockMultipartHttpServletRequestBuilder(httpMethod, uri);
+ }
+
/**
* Create a {@link MockMultipartHttpServletRequestBuilder} for a multipart request.
* @param urlTemplate a URL template; the resulting URL will be encoded
diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/MultipartControllerTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/MultipartControllerTests.java
index b60a0e6f6e..495ff3e17a 100644
--- a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/MultipartControllerTests.java
+++ b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/client/standalone/MultipartControllerTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2020 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -39,8 +39,8 @@ import org.springframework.test.web.reactive.server.EntityExchangeResult;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.test.web.servlet.client.MockMvcWebTestClient;
import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.filter.OncePerRequestFilter;
@@ -80,6 +80,18 @@ public class MultipartControllerTests {
MockMvcWebTestClient.resultActionsFor(exchangeResult)
.andExpect(model().attribute("fileContent", fileContent))
.andExpect(model().attribute("jsonContent", json));
+
+ // Now try the same with HTTP PUT
+ exchangeResult = testClient.put().uri("/multipartfile-via-put")
+ .bodyValue(bodyBuilder.build())
+ .exchange()
+ .expectStatus().isFound()
+ .expectBody().isEmpty();
+
+ // Further assertions on the server response
+ MockMvcWebTestClient.resultActionsFor(exchangeResult)
+ .andExpect(model().attribute("fileContent", fileContent))
+ .andExpect(model().attribute("jsonContent", json));
}
@Test
@@ -284,10 +296,11 @@ public class MultipartControllerTests {
}
+ @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@Controller
private static class MultipartController {
- @RequestMapping(value = "/multipartfile", method = RequestMethod.POST)
+ @PostMapping("/multipartfile")
public String processMultipartFile(@RequestParam(required = false) MultipartFile file,
@RequestPart(required = false) Map> file,
@RequestPart Map