본문으로 바로가기

[JUnit4][Error] Multipartfile 사용 시 tmp에 저장 안 되는 에러

category JAVA/JUnit 2022. 2. 20. 01:10

에러

java.io.FileNotFoundException

JUnit으로 Multipartfile upload 테스트 시에 tmp 폴더에 저장이 안 되는 에러.

 

원인

public String upload(@RequestParam MultipartFile uploadfile, Model model)
				throws IllegalStateException, IOException {
		
	FileDto dto = new FileDto(UUID.randomUUID().toString(), uploadfile.getOriginalFilename(),
			uploadfile.getContentType());

	File newFileName = new File(dto.getUuid() + "_" + dto.getFileName());
		
	// 물리적 파일로 변환
	uploadfile.transferTo(newFileName);
        
    	new FileReader(filePath + "/" + dto.getUuid() + "_" + dto.getFileName())

Case1. ) 정상 실행

new File(dto.getUuid() + "_" + dto.getFileName());

이 부분에서 파일이 생성되는데 아래 2군데에 저장이 된다.

 

ex) 저장 경로

1. workspace/test-project/uuid_test.json

2. C:\Users\홍길동\AppData\Local\Temp\uuid_test.json

 

그러므로 new FileReader(filePath + "/" + dto.getUuid() + "_" + dto.getFileName())

이 부분에서 file을 찾을 수 있었다. (filePath는 java.io.tmpdir로 선언된 변수)

 

Case2.) JUnit 테스트

tmp 폴더에는 저장되지 않는다.

ex) 저장 경로

1. workspace/test-project/uuid_test.json

 String path = System.getProperty("user.dir"); 

 File file = new File(path+"\\uuid_test.json");
 FileInputStream input = new FileInputStream(file);
 MockMultipartFile multipartFile = new MockMultipartFile("uploadfile",
             file.getName(), "application/json", IOUtils.toByteArray(input));
             
 mockMvc.perform(
         MockMvcRequestBuilders.fileUpload("/upload")
         .file(multipartFile)
         .param("some-random", "4"))
     .andExpect(status().is(200))
     .andExpect(content().string("success"));

위 소스는 JUnit으로 MockMultipartFile 테스트하는 소스.

 

해결

File newFileName = new File(filePath + "/" + dto.getUuid() + "_" + dto.getFileName());

File 저장하는 부분을 FileReader와 동일한 경로로 설정해주고 나서 해결됐다.

 

 

후기

왜 JUnit으로 테스트 할 때는 tmp 에 저장되지 않는지 정확한 이유를 모르겠다.

아니면 MockMultipartFile로 파일을 넘겨줄 때 잘못된 것인지 나중에 이유를 다시 찾아봐야겠다.

원인을 아시는 분이나 같은 에러를 겪으신 분 있으면 답글 부탁드립니다.