Comme MockMvcRequestBuilders#fileUpload
est obsolète, vous voudrez utiliser MockMvcRequestBuilders#multipart(String, Object...)
qui renvoie un MockMultipartHttpServletRequestBuilder
. Ensuite, enchaînez un tas d' file(MockMultipartFile)
appels.
Voici un exemple fonctionnel. Donné un@Controller
@Controller
public class NewController {
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public String saveAuto(
@RequestPart(value = "json") JsonPojo pojo,
@RequestParam(value = "some-random") String random,
@RequestParam(value = "data", required = false) List<MultipartFile> 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 String json;
public String getJson() {
return json;
}
public void setJson(String 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().string("success"));
}
}
Et la @Configuration
classe
@Configuration
@ComponentScan({ "test.controllers" })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
}
Le test doit réussir 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 en plusieurs parties, sauf avec un type de contenu différent.
MethodArgumentConversionNotSupportedException
en frappant le contrôleur .. une étape de suttle que j'ai manquée ici? - stackoverflow.com/questions/50953227/…Jetez un œil à cet exemple tiré de la vitrine de Spring MVC, voici le lien vers le code source :
la source
fileUpload
est obsolète au profit demultipart(String, Object...)
.La méthode
MockMvcRequestBuilders.fileUpload
est déconseillée à laMockMvcRequestBuilders.multipart
place.Ceci est un exemple:
la source
Voici ce qui a fonctionné pour moi, ici je joins un fichier à mon EmailController en cours de test. Jetez également un œil à la capture d'écran du facteur sur la façon dont je publie les données.
la source
Si vous utilisez Spring4 / SpringBoot 1.x, il convient de mentionner que vous pouvez également ajouter des parties "text" (json). Cela peut être fait via MockMvcRequestBuilders.fileUpload (). File (fichier MockMultipartFile) (qui est nécessaire car la méthode
.multipart()
n'est pas disponible dans cette version):la source