2011-10-24 15 views
7

Mam kontroler Spring (3.0) z metodą, która ma HttpServletRequest jako jeden z parametrów, ponieważ obsługuje (wiele) przesyłanie plików.Jak przesłać plik testowy urządzenia przy pomocy 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); 

Jak przeprowadzić test? Wiem, że mogę utworzyć MockHttpServletRequest, ale nie wiem, jak przekazać do niego jeden lub więcej plików.

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

Odpowiedz

9

polecam zmienić podpis metody trochę, aby przesłanego pliku normalny parametr (typu MultipartFile(nie 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); 

Następnie można użyć MockMultipartFile w teście:

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

Jeśli nie chcesz zmieniać podpisu metody, możesz zamiast tego użyć MockMultipartHttpServletRequest.

Posiada metodę addFile(MultipartFile file). Oczywiście wymaganym parametrem może być MockMultipartFile.

+0

'MultipartFile' wygląda naprawdę interesujący, ponieważ zawęża wykorzystanie na upload plików i tym interfejs wygląda znacznie jaśniej. Obawiam się jednak, że nie mogę go użyć, ponieważ obsługuje on tylko jeden plik naraz i nie przesyła wielu plików (liczba plików do przesłania jest otwarta, w moim przypadku od 1 do 7). – stivlo

+0

@stivlo: a co z tablicą pliku wieloczęściowego: 'MultipartFile []'? – Ralph

+0

Po prostu zdałem sobie sprawę, że zapomniałem odpowiedzieć na to pytanie, ale sztuczka aranżacji działała idealnie, dziękuję Ralf – stivlo

2

Można również użyć obiektu MockMvc jak MockMvcRequestBuilders aby wysłać żądanie przesyłania pliku testowego do kontrolera:

@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()); 
} 
Powiązane problemy