This example shows how to unit test Spring File upload controller by using MockMultipartFile.
MockMultipartFile does not use the application registered MultipartResolver, that means it is only suitable for testing application controllers that access multipart uploads.
Example
The Controller
@Controller
@RequestMapping("/upload")
public class FileUploadController {
public static final String targetFolder= "d:/filesUploaded/";
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String handlePostRequest(MultipartHttpServletRequest request,
Model model) throws IOException {
MultipartFile multipartFile = request.getFile("user-file");
String name = multipartFile.getOriginalFilename();
InputStream inputStream = multipartFile.getInputStream();
Files.copy(inputStream, Paths.get(targetFolder + name), StandardCopyOption.REPLACE_EXISTING);
model.addAttribute("msg", "File has been uploaded: " + name);
return "test response body";
}
}
Java Config
@EnableWebMvc
@Configuration
public class MyWebConfig {
@Bean
public FileUploadController uploadController() {
return new FileUploadController();
}
}
The Test class
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = MyWebConfig.class)
public class UploadControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() {
DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.wac);
this.mockMvc = builder.build();
}
@Test
public void testController() throws Exception {
ResultMatcher ok = MockMvcResultMatchers.status().isOk();
String fileName = "test.txt";
File file = new File(FileUploadController.targetFolder + fileName);
//delete if exits
file.delete();
MockMultipartFile mockMultipartFile = new MockMultipartFile("user-file",fileName,
"text/plain", "test data".getBytes());
MockHttpServletRequestBuilder builder =
MockMvcRequestBuilders.fileUpload("/upload")
.file(mockMultipartFile);
this.mockMvc.perform(builder).andExpect(ok)
.andDo(MockMvcResultHandlers.print());;
Assert.assertTrue(file.exists());
}
}mvn test -q Outputd:\example-projects\spring-mvc\file-upload\spring-mock-multipart-file-example>mvn test -q
------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.logicbig.example.UploadControllerTest
MockHttpServletRequest: HTTP Method = POST Request URI = /upload Parameters = {} Headers = {Content-Type=[multipart/form-data]}
Handler: Type = com.logicbig.example.FileUploadController Method = public java.lang.String com.logicbig.example.FileUploadController.handlePostRequest(org.springframework.web.multipart.MultipartHttpServletRequest,org.springframework.ui.Model) throws java.io.IOException
Async: Async started = false Async result = null
Resolved Exception: Type = null
ModelAndView: View name = null View = null Model = null
FlashMap: Attributes = null
MockHttpServletResponse: Status = 200 Error message = null Headers = {Content-Type=[text/plain;charset=ISO-8859-1], Content-Length=[18]} Content type = text/plain;charset=ISO-8859-1 Body = test response body Forwarded URL = null Redirected URL = null Cookies = [] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.108 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
Note:
Starting Spring 5.0, MockMvcRequestBuilders.fileUpload has been deprecated in favor of MockMvcRequestBuilders.multipart() method. Check out this example.
Example ProjectDependencies and Technologies Used: - spring-webmvc 4.2.4.RELEASE: Spring Web MVC.
- spring-test 4.2.4.RELEASE: Spring TestContext Framework.
- javax.servlet-api 3.0.1 Java Servlet API
- junit 4.12: JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck.
- commons-fileupload 1.3.1:
The Apache Commons FileUpload component provides a simple yet flexible means of adding support for multipart
file upload functionality to servlets and web applications.
- JDK 1.8
- Maven 3.3.9
|