繁体   English   中英

测试文件上传Spring MVC

[英]Test file upload Spring MVC

我想测试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中发送文件,但是如何将其作为参数发送?

编辑:

我已经更改了方法,但是问题不存在:

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

看起来方法使用2个MockMultipartFile实例。 第二个问题仍然存在,如何从邮递员那里测试这种方法?

是的,测试用例失败,因为问题最终出在您的测试用例中,您正在验证对updateFile ()的调用,该调用与在您使用uploadFile ()的controller的调用不正确,因此必须使用相同的方法进行verify

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

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

换句话说,当您尝试verify对其他方法(未在控制器中使用)的调用失败时,Mockito verify会验证方法被调用的次数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM