Java Spring MVC测试多文件上传

Java Spring MVC测试多文件上传,java,spring-mvc,spring-test-mvc,Java,Spring Mvc,Spring Test Mvc,我有一个控制器,可以处理多个文件上传: @PostMapping("/import") public void import(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) { assertUploadFilesNotEmpty(files); ... } 我想测试一下 @Test public void importTest() throws Exception {

我有一个控制器,可以处理多个文件上传:

 @PostMapping("/import")
 public void import(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) {
    assertUploadFilesNotEmpty(files);
    ...
}
我想测试一下

    @Test
public void importTest() throws Exception {
    MockMultipartFile file = new MockMultipartFile("file", "list.xlsx", MIME_TYPE_EXCEL, Files.readAllBytes(Paths.get(excelFile.getURI())));
    mvc.perform(fileUpload("/import").file(file).contentType(MIME_TYPE_EXCEL)).andExpect(status().isOk());
}
问题是MockMvc创建了MockHttpRequest,其中multipartFiles作为保存上传文件的param的名称。我的控制器希望这些文件位于“文件”参数中


是否可以告诉spring应该以给定的名称在请求中传递多个文件?

创建两个名为
文件的
MockMultiPartFile
实例

使用添加的Json请求正文以及以下多个文件完成工作示例:

@PostMapping(consumes=MediaType.MULTIPART_FORM_DATA_VALUE)
public void addProduct(@RequestPart(value="addProductRequest") @Valid AddUpdateProductRequest request,
                             @RequestPart(value = "files") final List<MultipartFile> files) throws Exception{

    request.setProductImages(files);
    productService.createProduct(request);
}


@Test
public void testUpdateProduct() throws Exception {


    AddUpdateProductRequest addProductRequest = prepareAddUpdateRequest();

    final InputStream inputStreamFirstImage = Thread.currentThread().getContextClassLoader().getResourceAsStream("test_image.png");
    final InputStream inputStreamSecondImage = Thread.currentThread().getContextClassLoader().getResourceAsStream("test_image2.png");

    MockMultipartFile jsonBody = new MockMultipartFile("addProductRequest", "", "application/json", JsonUtils.toJson(addProductRequest).getBytes());
    MockMultipartFile file1 = new MockMultipartFile("files", "test_image.png", "image/png", inputStreamFirstImage);
    MockMultipartFile file2 = new MockMultipartFile("files", "test_image2.png", "image/png", inputStreamSecondImage);


    ResultMatcher ok = MockMvcResultMatchers.status().isOk();
    mockMvc.perform(MockMvcRequestBuilders.fileUpload("/add-product")
                    .file(file1)
                    .file(file2)
                    .file(jsonBody)
                    .contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
                .andDo(MockMvcResultHandlers.log())
                .andExpect(ok)
                .andExpect(content().string("success"));
}
@PostMapping(consumes=MediaType.MULTIPART\u FORM\u DATA\u VALUE)
public void addProduct(@RequestPart(value=“addProductRequest”)@有效的AddUpdateProductRequest请求,
@RequestPart(value=“files”)最终列表文件)引发异常{
request.setProductImages(文件);
productService.createProduct(请求);
}
@试验
public void testUpdateProduct()引发异常{
AddUpdateProductRequest addProductRequest=prepareAddUpdateRequest();
final InputStream inputStreamFirstImage=Thread.currentThread().getContextClassLoader().getResourceAsStream(“test_image.png”);
final InputStream inputStreamSecondImage=Thread.currentThread().getContextClassLoader().getResourceAsStream(“test_image2.png”);
MockMultipartFile jsonBody=新的MockMultipartFile(“addProductRequest”、“application/json”、JsonUtils.toJson(addProductRequest.getBytes());
MockMultipartFile file1=新的MockMultipartFile(“files”,“test_image.png”,“image/png”,inputStreamFirstImage);
MockMultipartFile file2=新的MockMultipartFile(“files”、“test_image2.png”、“image/png”、inputStreamSecondImage);
ResultMatcher ok=MockMvcResultMatchers.status().isOk();
mockMvc.perform(MockMvcRequestBuilders.fileUpload(“/addproduct”)
.file(文件1)
.file(文件2)
.file(jsonBody)
.contentType(MediaType.MULTIPART\u FORM\u DATA\u VALUE))
.andDo(MockMvcResultHandlers.log())
.andExpect(确定)
.andExpect(content().string(“success”);
}