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

时间:2011-10-24 17:47:54

标签: 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);

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

MockHttpServletRequest request = new MockHttpServletRequest("POST", 
     "/classified/38001/dealer/54/upload?token=dfak241adf");

2 个答案:

答案 0 :(得分: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);

然后您可以在测试中使用MockMultipartFile

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);

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

它有一个方法addFile(MultipartFile file)。当然,所需参数可以是MockMultipartFile

答案 1 :(得分:2)

您还可以使用MockMvc对象以及MockMvcRequestBuilders将测试文件上传请求发送到您的控制器:

@Test
public void testSendNotEmptyFile() throws Exception {

          mvc.perform(MockMvcRequestBuilders.fileUpload("Your controller URL")
            .file("file", "Test Content".getBytes())
            .contentType(MediaType.MULTIPART_FORM_DATA)
            .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk());
}