如何使用MockHttpServletRequest对文件上传进行单元测试?

sti*_*vlo 7 java spring spring-mvc

我有一个Spring(3.0)控制器,其方法有HttpServletRequest一个参数,因为它处理(多个)文件上传.

@RequestMapping(value = "/classified/{idClassified}/dealer/{idPerson}/upload",
    method = RequestMethod.POST)
@ResponseBody
public final String uploadClassifiedPicture(
    @PathVariable int idClassified,
    @PathVariable int idPerson, 
    @RequestParam String token, 
    HttpServletRequest request);
Run Code Online (Sandbox Code Playgroud)

如何进行单元测试?我知道我可以创建一个MockHttpServletRequest,但我不知道如何传递一个或多个文件.

MockHttpServletRequest request = new MockHttpServletRequest("POST", 
     "/classified/38001/dealer/54/upload?token=dfak241adf");
Run Code Online (Sandbox Code Playgroud)

Ral*_*lph 9

我建议稍微更改方法签名,使上传的文件成为普通参数(类型(不是)):MultipartFile CommonsMultipartFile

@RequestMapping(value = "/classified/{idClassified}/dealer/{idPerson}/upload",
    method = RequestMethod.POST)
@ResponseBody
public final String uploadClassifiedPicture(
    @PathVariable int idClassified,
    @PathVariable int idPerson, 
    @RequestParam String token, 
    @RequestParam MultipartFile content);
Run Code Online (Sandbox Code Playgroud)

然后你可以MockMultipartFile在你的测试中使用a :

final String fileName = "test.txt";
final byte[] content = "Hallo Word".getBytes();
MockMultipartFile mockMultipartFile =
       new MockMultipartFile("content", fileName, "text/plain", content);

uploadClassifiedPicture(1, 1, "token", mockMultipartFile);
Run Code Online (Sandbox Code Playgroud)

如果您不想更改方法签名,则可以使用MockMultipartHttpServletRequest.

它有一种方法addFile(MultipartFile file).当然,所需的参数可以是a MockMultipartFile.