Ponieważ MockMvcRequestBuilders#fileUpload
jest przestarzałe, będziesz chciał użyć, MockMvcRequestBuilders#multipart(String, Object...)
który zwraca plik MockMultipartHttpServletRequestBuilder
. Następnie file(MockMultipartFile)
połącz kilka połączeń.
Oto działający przykład. Dawać@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;
}
}
}
i test jednostkowy
@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"));
}
}
I @Configuration
klasa
@Configuration
@ComponentScan({ "test.controllers" })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
return multipartResolver;
}
}
Test powinien zakończyć się pomyślnie i dać wynik
4 // from param
someValue // from json file
filename.txt // from first file
other-file-name.data // from second file
Należy zauważyć, że wysyłasz JSON tak jak każdy inny plik wieloczęściowy, z wyjątkiem innego typu zawartości.
Sotirios Delimanolis
źródło
MethodArgumentConversionNotSupportedException
po naciśnięciu kontrolera ... jakiś mały krok, który tu przegapiłem? - stackoverflow.com/questions/50953227/ ...Spójrz na ten przykład zaczerpnięty z wiosennej prezentacji MVC, oto link do kodu źródłowego :
źródło
fileUpload
jest przestarzały na korzyśćmultipart(String, Object...)
.Metoda
MockMvcRequestBuilders.fileUpload
jest przestarzała użyjMockMvcRequestBuilders.multipart
zamiast tego.To jest przykład:
źródło
Oto, co zadziałało dla mnie, tutaj załączam plik do mojego testowanego EmailController. Spójrz także na zrzut ekranu listonosza, pokazujący, jak publikuję dane.
źródło
Jeśli używasz Spring4 / SpringBoot 1.x, to warto wspomnieć, że możesz również dodać części "text" (json). Można to zrobić za pomocą MockMvcRequestBuilders.fileUpload (). File (MockMultipartFile file) (co jest potrzebne, ponieważ metoda
.multipart()
nie jest dostępna w tej wersji):źródło