2011-10-24 27 views
7

Tôi có bộ điều khiển Spring (3.0) với phương pháp có HttpServletRequest là một trong các tham số vì nó xử lý (nhiều) tệp tải lên.Làm cách nào để tải lên tệp thử nghiệm đơn vị bằng MockHttpServletRequest?

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

Làm thế nào để kiểm tra đơn vị? Tôi biết tôi có thể tạo một MockHttpServletRequest nhưng tôi không biết cách chuyển một hoặc nhiều tệp vào đó.

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

Trả lời

9

Tôi khuyên bạn nên thay đổi phương pháp chữ ký một chút, để làm cho các tập tin được tải lên một tham số bình thường (loại MultipartFile(không 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); 

Sau đó, bạn có thể sử dụng một MockMultipartFile trong thử nghiệm của bạn:

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

Nếu bạn không muốn thay đổi chữ ký phương thức, bạn có thể sử dụng MockMultipartHttpServletRequest để thay thế.

Nó có phương thức addFile(MultipartFile file). Và tất nhiên thông số bắt buộc có thể là MockMultipartFile.

+0

'MultipartFile' trông thật sự thú vị, bởi vì nó thu hẹp việc sử dụng tải lên tệp và giao diện trông rõ ràng hơn nhiều. Tuy nhiên, tôi sợ rằng tôi không thể sử dụng nó, bởi vì nó chỉ hỗ trợ một tệp tại một thời điểm và không phải nhiều tệp tải lên (với số tệp để tải lên đang mở, trong trường hợp của tôi từ 1 đến 7). – stivlo

+0

@stivlo: về một mảng của MultipartFile: 'MultipartFile []'? – Ralph

+0

Tôi chỉ nhận ra rằng tôi đã quên trả lời câu hỏi này, nhưng thủ thuật mảng hoạt động hoàn hảo, cảm ơn bạn Ralf – stivlo

2

Bạn cũng có thể sử dụng đối tượng MockMvc cũng như MockMvcRequestBuilders để gửi yêu cầu upload file test để điều khiển của bạn:

@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()); 
} 
Các vấn đề liên quan