如何在Spring中使用Mock编写CommonsMultipartFile的单元测试

问题描述:

我使用spring 3.0 org.springframework.web.multipart.commons.CommonsMultipartFile进行文件上传。我想用Mockito写下文件上传的单元测试用例。如何在Spring中使用Mock编写CommonsMultipartFile的单元测试

以下是我的控制器类

private RegistrationService registrationService; 

@RequestMapping(method = RequestMethod.POST) 
    public String create(Registration registration, BindingResult result,ModelMap model) 
      throws NumberFormatException, Exception { 

     File uploadedFile = uploadFile(registration); 
     List<Registration> userDetails = new ArrayList<Registration>(); 
     processUploadedFile(uploadedFile,userDetails); 

     model.addAttribute("userDetails", userDetails); 

     return "Registration"; 
    } 

    private File uploadFile(Registration registration) { 

     Date dt = new Date(); 
     SimpleDateFormat format = new SimpleDateFormat("MM_dd_yyyy_HH_mm_ss"); 
     File uploadedFile = new File(uploadFileLocation 
       + registration.getFileData().getOriginalFilename() + "." 
       + format.format(dt)); 

     try { 
      registration.getFileData().transferTo(uploadedFile); 

     } catch (IllegalStateException e) { 
      logger.error("Error occurred while uploading file", e); 
     } catch (IOException e) { 
      logger.error("Error occurred while uploading file", e); 
     } 

     return uploadedFile; 
    } 

    private void processUploadedFile(File uploadedFile, List<Registration> userDetails) 
      throws NumberFormatException, Exception { 

     registrationService.processFile(uploadedFile, userDetails); 
    } 

注册类

public class Registration { 
    private String name; 
    private CommonsMultipartFile fileData; 


    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public CommonsMultipartFile getFileData() { 
     return fileData; 
    } 

    public void setFileData(CommonsMultipartFile fileData) { 
     this.fileData = fileData; 
    } 
} 

我的服务类方法

public void processFile(File uploadedFile, 
      List<Registration> userDetails) throws NumberFormatException, 
      Exception {  

     String record = ""; 

     try { 

      FileWriter fstream = new FileWriter(outputFileLocation 
        + uploadedFile.getName()); 
      BufferedWriter out = new BufferedWriter(fstream); 

      BufferedReader br = new BufferedReader(new FileReader(
        uploadedFile.getAbsolutePath())); 

      while ((record = br.readLine()) != null) { 
       String[] requesterUser = record.split(","); 

       if (insertUserToDB(requesterUser, userDetails) > 0) 
        out.write(record + ", Yes"); 
       else 
        out.write(record + ", No"); 

       out.newLine(); 

      } 
      out.flush(); 
      out.close(); 

     } catch (FileNotFoundException e) { 
      logger.error("Error occured while processing file", e); 
     } catch (IOException e) { 

      logger.error("Error occured while processing file", e); 
     } 


    } 

如何单元测试吗?我是新来的Mockito。

编辑

我写下的测试方法进行测试上面的代码,但它multipartFile返回null。我应该如何测试以上服务类的processFile方法?

@Test 
     public void testProcessFile() { 
     private static final String TEST_FILE = "c:\\user.csv"; 
     MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest(); 
     MockMultipartHttpServletRequest mockMultipartHttpServletRequest = (MockMultipartHttpServletRequest)request; 
     MultipartFile multipartFile = (MultipartFile) mockMultipartHttpServletRequest.getFile(TEST_FILE); 

     Registration registration=new Registration(); 
     registration.setFileData(multipartFile); 
     RegistrationService.processFile(uploadedFile, userDetails); 
     } 

我是JUnit和mockito的新手。任何帮助或指针真的很感激。

您可能想考虑使用Spring的模拟实现(org.springframework.mock.web.MockMultipartFile),而不是使用Mockito创建模拟。

Heinrich Filter是正确的,但您还需要将字段fileData的类型从CommonsMulitPartFile更改为org.springframework.web.multipart.MultipartFile。 (这是上述CommonsMulitPartFileMockMultipartFile超级接口。

如果你已经这样做了,那么你就可以创建一个由弹簧提供

MockMultipartFile mockMultipartFile = new MockMultipartFile(
    "fileData", 
    fileName, 
    "text/plain", 
    content); 
+0

我写的多文件itselfe与模拟对象的模拟down测试方法使用org.springframework.web.multipart.MultipartFile,但对于multipartFile它返回空值 – Raje 2012-01-10 10:46:16

+0

我想,这是因为你没有把任何内容放在MockMultipartFile对象中(请参阅我的答案中的示例)。BTW:在你的测试中的演员是不需要的! – Ralph 2012-01-10 11:20:29