2011-10-24 9 views
7

Tengo un controlador Spring (3.0) con un método que tiene HttpServletRequest como uno de los parámetros, ya que se trata de la carga de archivos (múltiples).¿Cómo probar unida las cargas de archivos con 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); 

Cómo probarlo? Sé que puedo crear un MockHttpServletRequest, pero no sé cómo pasarle uno o más archivos.

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

Respuesta

9

me recomiendan cambiar la firma del método un poco, para que el archivo subido un parámetro normal (de tipo MultipartFile(no 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); 

A continuación, se puede utilizar un MockMultipartFile en su ensayo:

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

Si no desea cambiar la firma del método, puede usar MockMultipartHttpServletRequest en su lugar.

Tiene un método addFile(MultipartFile file). Y, por supuesto, el parámetro requerido puede ser MockMultipartFile.

+0

'MultipartFile' se ve muy interesante, ya que limita el uso de archivo de carga y la la interfaz parece mucho más clara. Sin embargo, me temo que no puedo usarlo, ya que solo admite un archivo a la vez y no múltiples archivos cargados (con el número de archivos para cargar abiertos, en mi caso del 1 al 7). – stivlo

+0

@stivlo: ¿qué tal una matriz de MultipartFile: 'MultipartFile []'? – Ralph

+0

Me acabo de dar cuenta de que olvidé responder a esto, pero el truco de arreglo funcionó perfectamente, gracias Ralf – stivlo

2

también puede utilizar el objeto MockMvc, así como MockMvcRequestBuilders para enviar una petición de carga de archivos de prueba para su controlador:

@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()); 
} 
Cuestiones relacionadas