Utilisation du test Spring MVC pour tester une requête POST multipart

J’ai le gestionnaire de requête suivant pour enregistrer des autos. J’ai vérifié que cela fonctionne lorsque j’utilise par exemple cURL. Je souhaite maintenant tester la méthode avec Spring MVC Test. J’ai essayé d’utiliser le fichier fileUploader, mais je n’arrive pas à le faire fonctionner. Je n’arrive pas non plus à append la partie JSON.

Comment pourrais-je tester cette méthode avec Spring MVC Test? Je ne suis pas en mesure de trouver des exemples à ce sujet.

@RequestMapping(value = "autos", method = RequestMethod.POST) public ResponseEntity saveAuto(@RequestPart(value = "data") AutoResource, @RequestParam(value = "files[]", required = false) List files) {...} 

Je veux éditer une représentation JSON pour mon auto + un ou plusieurs fichiers.

Je vais append 100 en prime à la bonne réponse!

Comme MockMvcRequestBuilders#fileUpload est obsolète, vous souhaiterez utiliser MockMvcRequestBuilders#multipart(Ssortingng, Object...) qui retourne un MockMultipartHttpServletRequestBuilder . Puis enchaîner un tas d’appels de file(MockMultipartFile) .

Voici un exemple de travail. Compte tenu de @Controller

 @Controller public class NewController { @RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public Ssortingng saveAuto( @RequestPart(value = "json") JsonPojo pojo, @RequestParam(value = "some-random") Ssortingng random, @RequestParam(value = "data", required = false) List files) { System.out.println(random); System.out.println(pojo.getJson()); for (MultipartFile file : files) { System.out.println(file.getOriginalFilename()); } return "success"; } static class JsonPojo { private Ssortingng json; public Ssortingng getJson() { return json; } public void setJson(Ssortingng json) { this.json = json; } } } 

et un test unitaire

 @WebAppConfiguration @ContextConfiguration(classes = WebConfig.class) @RunWith(SpringJUnit4ClassRunner.class) public class Example { @Autowired private WebApplicationContext webApplicationContext; @Test public void test() throws Exception { MockMultipartFile firstFile = new MockMultipartFile("data", "filename.txt", "text/plain", "some xml".getBytes()); MockMultipartFile secondFile = new MockMultipartFile("data", "other-file-name.data", "text/plain", "some other type".getBytes()); MockMultipartFile jsonFile = new MockMultipartFile("json", "", "application/json", "{\"json\": \"someValue\"}".getBytes()); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); mockMvc.perform(MockMvcRequestBuilders.multipart("/upload") .file(firstFile) .file(secondFile) .file(jsonFile) .param("some-random", "4")) .andExpect(status().is(200)) .andExpect(content().ssortingng("success")); } } 

Et la classe de @Configuration

 @Configuration @ComponentScan({ "test.controllers" }) @EnableWebMvc public class WebConfig extends WebMvcConfigurationSupport { @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); return multipartResolver; } } 

Le test devrait passer et vous donner une sortie de

 4 // from param someValue // from json file filename.txt // from first file other-file-name.data // from second file 

La chose à noter est que vous envoyez le JSON comme n’importe quel autre fichier multipart, sauf avec un type de contenu différent.

Jetez un oeil à cet exemple tiré de la visortingne du spring MVC, ceci est le lien vers le code source :

 @RunWith(SpringJUnit4ClassRunner.class) public class FileUploadControllerTests extends AbstractContextControllerTests { @Test public void readSsortingng() throws Exception { MockMultipartFile file = new MockMultipartFile("file", "orig", null, "bar".getBytes()); webAppContextSetup(this.wac).build() .perform(fileUpload("/fileupload").file(file)) .andExpect(model().atsortingbute("message", "File 'orig' uploaded successfully")); } } 

La méthode MockMvcRequestBuilders.fileUpload est obsolète, utilisez plutôt MockMvcRequestBuilders.multipart .

Ceci est un exemple:

 import static org.hamcrest.CoreMatchers.containsSsortingng; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.multipart.MultipartFile; /** * Unit test New Controller. * */ @RunWith(SpringRunner.class) @WebMvcTest(NewController.class) public class NewControllerTest { private MockMvc mockMvc; @Autowired WebApplicationContext wContext; @MockBean private NewController newController; @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(wContext) .alwaysDo(MockMvcResultHandlers.print()) .build(); } @Test public void test() throws Exception { // Mock Request MockMultipartFile jsonFile = new MockMultipartFile("test.json", "", "application/json", "{\"key1\": \"value1\"}".getBytes()); // Mock Response NewControllerResponseDto response = new NewControllerDto(); Mockito.when(newController.postV1(Mockito.any(Integer.class), Mockito.any(MultipartFile.class))).thenReturn(response); mockMvc.perform(MockMvcRequestBuilders.multipart("/fileUpload") .file("file", jsonFile.getBytes()) .characterEncoding("UTF-8")) .andExpect(status().isOk()); } }