测试文件上传Spring MVC

时间:2016-10-30 11:36:35

标签: java spring unit-testing mockito

我想通过REST API测试文件上传。我发现以RequestParam而不是RequestBody发送文件非常令人困惑。

控制器方法:

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public
@ResponseBody
ResponseEntity<String> uploadFile(
        @RequestParam(name = "file") MultipartFile multipartFile,
        @RequestParam(name = "path") String path) {
    logger.debug("File upload REST requested");

    return new ResponseEntity<>(fileService.uploadFile(
            multipartFile, path),
            HttpStatus.OK);
}

1.现在我想测试它并且我已经使用了模拟器。在调试时,我看到模拟服务正在运行但是没有调用这个参数的方法,因此测试失败了。我怎么能处理这个?

@Test
public void testUploadFile() throws Exception {
    String mockName = "mock";
    MockMultipartFile mockMultipartFile = new MockMultipartFile(mockName, mockName.getBytes());

    when(mockFileService.uploadFile(mockMultipartFile, rootDir)).thenReturn("success");

    mockMvc.perform(MockMvcRequestBuilders.fileUpload("/files/upload")
            .file("file", mockMultipartFile.getBytes())
            .param("path", rootDir))
            .andExpect(status().isOk())
            .andExpect(content().string("success"));

    verify(mockFileService, times(1)).updateFile(mockMultipartFile, rootDir);
    verifyNoMoreInteractions(mockFileService);
}

2.我如何用邮递员测试?我看到我可以在Body中发送文件,但是我怎么能把它作为param发送?

修改

我已经改变了方法,但问题不在那里:

Argument(s) are different! Wanted:
mockFileService.uploadFile(
org.springframework.mock.web.MockMultipartFile@61bd0845,
"/"
);

看起来方法正在使用MockMultipartFile的2个实例。第二个问题仍然是开放的,如何从Postman测试这种方法?

1 个答案:

答案 0 :(得分:0)

是的,测试用例失败了,因为 问题出在最后的测试用例中,您正在验证对updateFile()的调用是否正确,因为controller正在使用uploadFile(),您必须使用与verify相同的方法。

因此,您需要更改verify行,如下所示:

verify(mockFileService, times(1)). uploadFile(mockMultipartFile, rootDir);

换句话说,Mockito验证验证调用方法的次数,因为您试图verify调用其他方法(未在控制器中使用),它失败了。