Dado que MockMvcRequestBuilders#fileUpload
está obsoleto, querrá usarMockMvcRequestBuilders#multipart(String, Object...)
que devuelve un MockMultipartHttpServletRequestBuilder
. Luego encadena un montón de file(MockMultipartFile)
llamadas.
Aquí tienes un ejemplo práctico. Dado 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;
}
}
}
y una prueba unitaria
@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"));
}
}
Y el @Configuration
clase
@Configuration
@ComponentScan({ "test.controllers" })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
}
La prueba debe pasar y darle una salida de
4 // from param
someValue // from json file
filename.txt // from first file
other-file-name.data // from second file
Lo que debe tener en cuenta es que está enviando el JSON como cualquier otro archivo de varias partes, excepto con un tipo de contenido diferente.
MethodArgumentConversionNotSupportedException
al presionar el controlador ... ¿algún paso pequeño que me haya perdido aquí? - stackoverflow.com/questions/50953227/…Eche un vistazo a este ejemplo tomado del escaparate de Spring MVC, este es el enlace al código fuente :
fuente
fileUpload
está en desuso a favor demultipart(String, Object...)
.El método
MockMvcRequestBuilders.fileUpload
es de uso obsoletoMockMvcRequestBuilders.multipart
.Esto es un ejemplo:
fuente
Esto es lo que funcionó para mí, aquí estoy adjuntando un archivo a mi EmailController bajo prueba. También eche un vistazo a la captura de pantalla del cartero sobre cómo estoy publicando los datos.
fuente
Si está utilizando Spring4 / SpringBoot 1.x, entonces vale la pena mencionar que también puede agregar partes de "texto" (json). Esto se puede hacer a través del archivo MockMvcRequestBuilders.fileUpload (). (Archivo MockMultipartFile) (que es necesario ya que el método
.multipart()
no está disponible en esta versión):fuente