Como MockMvcRequestBuilders#fileUpload
está obsoleto, você desejará usar o MockMvcRequestBuilders#multipart(String, Object...)
que retorna a MockMultipartHttpServletRequestBuilder
. Em seguida, encadeie um monte de file(MockMultipartFile)
chamadas.
Aqui está um exemplo prático. Dado um@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;
}
}
}
e um teste de unidade
@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"));
}
}
E a @Configuration
aula
@Configuration
@ComponentScan({ "test.controllers" })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
}
O teste deve passar e fornecer a saída de
4 // from param
someValue // from json file
filename.txt // from first file
other-file-name.data // from second file
É importante observar que você está enviando o JSON como qualquer outro arquivo multiparte, exceto com um tipo de conteúdo diferente.
Sotirios Delimanolis
fonte
MethodArgumentConversionNotSupportedException
lançado ao atingir o controlador ... alguma pequena etapa que perdi aqui? - stackoverflow.com/questions/50953227/…Dê uma olhada neste exemplo tirado do showcase da primavera MVC, este é o link para o código-fonte :
fonte
fileUpload
foi preterido e substituído pormultipart(String, Object...)
.O método
MockMvcRequestBuilders.fileUpload
está obsoleto, use emMockMvcRequestBuilders.multipart
vez disso.Isto é um exemplo:
fonte
Aqui está o que funcionou para mim, aqui estou anexando um arquivo ao meu EmailController em teste. Também dê uma olhada na captura de tela do carteiro sobre como estou postando os dados.
fonte
Se você estiver usando Spring4 / SpringBoot 1.x, vale a pena mencionar que você também pode adicionar partes de "texto" (json). Isso pode ser feito via MockMvcRequestBuilders.fileUpload (). File (arquivo MockMultipartFile) (que é necessário porque o método
.multipart()
não está disponível nesta versão):fonte