[英]How to write unit test for CommonsMultipartFile with Mock in Spring
我使用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的新手。
編輯
我已經寫下了用於測試上面代碼的Test方法,但是對於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的Mock實現( org.springframework.mock.web.MockMultipartFile
),而不是使用Mockito創建模擬。
Heinrich Filter是正確的,但您還需要將字段fileData
的類型從CommonsMulitPartFile
為org.springframework.web.multipart.MultipartFile
。 (這是CommonsMulitPartFile
和MockMultipartFile
之上的超級接口。
如果你已經這樣做了,那么你可以使用spring提供的模擬對象創建一個多部分文件itselfe的模擬
MockMultipartFile mockMultipartFile = new MockMultipartFile(
"fileData",
fileName,
"text/plain",
content);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.