2015-01-30 15 views
7

Ho caricato correttamente un file immagine su WebContent\resources\uploads\image.jsp. Ma sto affrontando un problema nel testare questo usando MockMvc. Quando eseguo il test, ricevo le eccezioni file non trovato e accesso negato.Carica file utilizzando Spring mvc e MockMVC

Il controller si presenta così:

@RequestMapping(value="/AddContacts", method=RequestMethod.POST) 
    public @ResponseBody String addContacts(ContactBean cb,HttpServletRequest request,HttpServletResponse response,@RequestParam("upload") MultipartFile file) throws IllegalStateException, IOException 
    { 

     String error=cb.validate(); 
     if(error.equals("")){ 
      Model m=new Model(); 
      String ret=m.addData(cb); 
      System.out.println("Contact Bean: "+cb); 
      if(ret.equals("DBFAIL")){ 
       response.setStatus(500); 
      } 
      else if(ret.equals("EXIST")){ 
       response.setStatus(409); 
      } 
      else{ 
       response.setStatus(200); 
       /* to upload a file */ 
       if(file != null && file.getSize() > 0){ 
        System.out.println("File name: "+file.getOriginalFilename()); 
        String dir="C:\\web_latest\\Admin_FileUpload_29_01_15\\WebContent\\resources\\uploads\\"+cb.getName()+"_"+cb.getId()+"\\"; 
        //String dir="C:\\Upload\\"+cb.getName()+"_"+cb.getId()+"\\"; 
        File directory = new File(dir); 
        if (directory.exists()) { 
         System.out.println("Directory already exists ..."); 

        } 
        else { 
         System.out.println("Directory not exists, creating now"); 
         boolean success = directory.mkdir(); 
         if (success) { 
          System.out.printf("Successfully created new directory : %s%n", dir); 
         } 
         else { 
          System.out.printf("Failed to create new directory: %s%n", dir); 
         } 
        } 
        String fileName = file.getOriginalFilename(); 
        file.transferTo(new File(dir+fileName)); 
       } 
      } 
      return error; 
     } 
     else{ 
      //response.setStatus(500); 
      return error; 
     } 

    } 

Il mio banco di prova è come questo:

public void testAddContacts() throws Exception { 
    FileInputStream fis=new FileInputStream("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg"); 
    //MockMultipartFile upload = new MockMultipartFile("upload", "Penguins.jpg", "image/jpeg", "C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg\\".getBytes()); 

    MockMultipartFile upload= new MockMultipartFile("upload",fis); 
    MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
     mockMvc.perform(MockMvcRequestBuilders.fileUpload("/AddContacts") 
       .file(upload) 
       .param("some-random", "4") 
       .param("name","deerdad") 
       .param("email","[email protected]") 
       .param("phone", "1234567890")) 
      .andExpect(status().is(200)); 
} 

Il mio file jsp è come questo:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
     pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Insert title here</title> 
    <link rel="stylesheet" type="text/css" href="${pageContext.servletContext.contextPath}/resources/css/form.css"> 
    <script type="text/javascript" src="${pageContext.servletContext.contextPath}/resources/js/jquery-1.11.1.js"></script> 

     <script> 


     function doAdd() { 
     // get the form values 
     var name = $('#name').val(); 
     var email = $('#email').val(); 
     var phone = $('#phone').val(); 

     var file = document.getElementById("uploadfile"); 
     var formData = new FormData(); 
     formData.append("upload", file.files[0]); 
     formData.append("name",$('#name').val()); 
     formData.append("email",$('#email').val()); 
     formData.append("phone",$('#phone').val()); 


     $.ajax({ 
      type: "POST", 
      url: "AddContacts", 
      data: formData, 
      processData: false, 
      contentType: false, 
      success: function(response){ 
         $("#error").text(""); 
         if(response==""){ 
          $("#info").text("successfully added"); 
          $('#myTable').append("<tr><td><input type='checkbox' name='cb' value='"+ response+"'><td>"+name + "</td><td>"+email + "</td><td>"+phone + "</td></tr>"); 
          $("#addForm").hide(); 
         } 
         else{ 
          $("#info").text(response); 
         } 
        }, 
      error: function(){ 
       $("#info").text(""); 
       $("#error").text("Internal server error"); 
      },  
      statusCode: { 
         409: function(response,statusText) { 
          $("#info").text(""); 
          $("#error").text("Name already exists ["+response.statusText+"]"); 
         }, 
         500: function(response,statusText) { 
          $("#info").text(""); 
          $("#error").text("database problem ["+response.statusText+"]"); 
         } 
         } 
     }); 
     } 
     </script> 

    </head> 
    <body bgcolor="FFFFCC"> 
     <center> 
      <form:form action="" method="post" name="addForm" id="ufile" modelAttribute="upload" class="dark-matter"> 
       <h1> 
        Add Contacts <span>Please fill all the texts in the fields</span> 
       </h1> 
       <p> 
        <label> 
         <input id="id" type="hidden"> 
        </label> 
        <label> 
         <span>Your Name</span> 
         <input id="name" type="text" name="name" placeholder="Your Full Name"> 
        </label> 
        <label> 
         <span>Your Email</span> 
         <input id="email" type="text" name="email" placeholder="Your Email"> 
        </label> 
        <label> 
         <span>Your Phone</span> 
         <input id="phone" type="text" name="phone" placeholder="Your phone"> 
        </label> 
        <label> 
         <span>Upload Photo</span> 
         <input type="file" id="uploadfile" accept="image/*" name="uploadfile">    
        </label> 
        <label> 
         <span>&nbsp;</span> 
         <input type="button" class="button" id="btn" value="Add Me" onclick="doAdd()"> 
        </label> 
       </p> 
      </form:form> 
      <!-- 
      <div STYLE="color: #FF3333; background-color: #8888ff; width: 100px; border-radius: 10px; cursor: pointer;" id="sub"> 
       Add Me 
      </div> 
      --> 
      <!-- 
      <input type="hidden" id="id" > 
       <br/> 
       Name : <input type="text" id="name"><br/><br/> 
       Email : <input type="text" id="email"><br/><br/> 
       Phone : <input type="text" id="phone"><br/><br/> 
      <input type="button" value="Add Me" onclick="doAdd()"> 
      <br/> 
      --> 
     </center> 
    </body> 
</html> 
+0

Stessa domanda e risposta migliore: http://stackoverflow.com/questions/21800726/usin g-spring-mvc-test-unità-test-multipart post-richiesta –

risposta

15
public void testAddContacts() throws Exception{ 
      File f = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg"); 
      System.out.println(f.isFile()+" "+f.getName()+f.exists()); 
      FileInputStream fi1 = new FileInputStream(f); 
      FileInputStream fi2 = new FileInputStream(new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Tulips.jpg")); 
      MockMultipartFile fstmp = new MockMultipartFile("upload", f.getName(), "multipart/form-data",fi1); 
      MockMultipartFile secmp = new MockMultipartFile("upload", "Tulips.jpg","multipart/form-data",fi2); 
      MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
      mockMvc.perform(MockMvcRequestBuilders.fileUpload("/AddContacts")     
        .file(fstmp) 
        .file(secmp) 
        .param("name","abc").param("email","[email protected]").param("phone", "1234567890"))    
        .andExpect(status().isOk()); 
    } 
Problemi correlati