我想通过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测试这种方法?
答案 0 :(得分:0)
是的,测试用例失败了,因为
问题出在最后的测试用例中,您正在验证对updateFile
()的调用是否正确,因为controller
正在使用uploadFile
(),您必须使用与verify
相同的方法。
因此,您需要更改verify
行,如下所示:
verify(mockFileService, times(1)). uploadFile(mockMultipartFile, rootDir);
换句话说,Mockito验证验证调用方法的次数,因为您试图verify
调用其他方法(未在控制器中使用),它失败了。