在 Spring MVC 中测试文件上传

Testing for file upload in Spring MVC

项目设置:

    <java.version>1.8</java.version>
    <spring.version>4.3.9.RELEASE</spring.version>
    <spring.boot.version>1.4.3.RELEASE</spring.boot.version>

我们有一个 REST 控制器,它有一个像这样上传文件的方法:

@PostMapping("/spreadsheet/upload")
public ResponseEntity<?> uploadSpreadsheet(@RequestBody MultipartFile file) {
    if (null == file || file.isEmpty()) {
        return new ResponseEntity<>("please select a file!", HttpStatus.NO_CONTENT);
    } else if (blueCostService.isDuplicateSpreadsheetUploaded(file.getOriginalFilename())) {
        return new ResponseEntity<>("Duplicate Spreadsheet. Please select a different file to upload",
                HttpStatus.CONFLICT);
    } else {
        try {
            saveUploadedFiles(Arrays.asList(file));

        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity("Successfully uploaded - " + file.getOriginalFilename(), new HttpHeaders(),
                HttpStatus.OK);
    }

}

更新: 我已经从我发现的一个旧示例中尝试了这种方法,但是它没有干净地编译,未定义 MockMvcRequestBuilders.multipart 方法....

@Test    
    public void testUploadSpreadsheet_Empty() throws Exception {

        String fileName = "EmptySpreadsheet.xls";
        String content  = "";

        MockMultipartFile mockMultipartFile = new MockMultipartFile(
                "emptyFile",
                fileName,
                "text/plain",
                content.getBytes());

        System.out.println("emptyFile content is '" + mockMultipartFile.toString() + "'.");

        mockMvc.perform(MockMvcRequestBuilders.multipart("/bluecost/spreadsheet/upload")
                .file("file", mockMultipartFile.getBytes())
                .characterEncoding("UTF-8"))
        .andExpect(status().isOk());

    }

我相信 MockMvcRequestBuilders.multipart() 仅在 Spring 5 之后可用。您想要的是 MockMvcRequestBuilders.fileUpload() 在 Spring 4.

中可用