Da MockMvcRequestBuilders#fileUpload
es veraltet ist, möchten Sie verwenden, MockMvcRequestBuilders#multipart(String, Object...)
welches a zurückgibt MockMultipartHttpServletRequestBuilder
. Dann verketten Sie eine Reihe von file(MockMultipartFile)
Anrufen.
Hier ist ein Arbeitsbeispiel. Angenommen@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;
}
}
}
und ein Unit-Test
@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"));
}
}
Und die @Configuration
Klasse
@Configuration
@ComponentScan({ "test.controllers" })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
}
Der Test sollte bestehen und Ihnen eine Ausgabe von geben
4 // from param
someValue // from json file
filename.txt // from first file
other-file-name.data // from second file
Beachten Sie, dass Sie den JSON wie jede andere mehrteilige Datei senden, außer mit einem anderen Inhaltstyp.
MethodArgumentConversionNotSupportedException
Modellobjekt wirft, wenn es auf den Controller trifft. Gibt es einen kleinen Schritt, den ich hier verpasst habe? - stackoverflow.com/questions/50953227/…Schauen Sie sich dieses Beispiel aus dem MVC-Schaufenster im Frühjahr an. Dies ist der Link zum Quellcode :
quelle
fileUpload
wird zugunsten von abgelehntmultipart(String, Object...)
.Die Methode
MockMvcRequestBuilders.fileUpload
istMockMvcRequestBuilders.multipart
stattdessen veraltet .Dies ist ein Beispiel:
quelle
Folgendes hat bei mir funktioniert: Hier hänge ich eine Datei an meinen getesteten EmailController an. Schauen Sie sich auch den Postboten-Screenshot an, wie ich die Daten poste.
quelle
Wenn Sie Spring4 / SpringBoot 1.x verwenden, ist es erwähnenswert, dass Sie auch "Text" -Teile (JSON) hinzufügen können. Dies kann über die Datei MockMvcRequestBuilders.fileUpload (). (Datei MockMultipartFile) erfolgen (die benötigt wird, da die Methode
.multipart()
in dieser Version nicht verfügbar ist):quelle