【问题标题】:How to write unit test for CommonsMultipartFile with Mock in Spring如何在 Spring 中使用 Mock 为 CommonsMultipartFile 编写单元测试
【发布时间】:2012-02-06 15:13:56
【问题描述】:

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

以下是我的控制器类

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 的新手。非常感谢任何帮助或指针。

【问题讨论】:

    标签: java spring unit-testing spring-mvc mocking


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      如果你已经这样做了,那么你可以使用 spring 提供的模拟对象创建多部分文件本身的模拟

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

      【讨论】:

      • 我已经写下使用 org.springframework.web.multipart.MultipartFile 的测试方法,但是对于 multipartFile 它返回空值。
      • 我猜,这是因为您没有在 MockMultipartFile 对象中放置任何内容(请参阅我的答案中的示例)。顺便说一句:不需要您的测试中的演员表!
      猜你喜欢
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 2023-02-04
      • 2019-09-27
      • 1970-01-01
      • 2019-11-19
      • 2015-05-17
      相关资源
      最近更新 更多