一、MockMultipartFile是什么
在测试文件上传功能时,需要构造一个mock file。MockMultipartFile适用于我们的测试环境,它是Spring MVC框架提供的一个支持文件上传的工具类。MockMultipartFile类可以用来生成一个基于内存的文件模拟实例,我们可以利用其提供的各种设置方法,生成一个代表某个资源的MultipartFile,将其传递给Bean(或者Service等其他处理上传文件的组件), 完成文件上传的测试。
二、如何使用MockMultipartFile
在使用之前,需要先通过maven指定依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.14.RELEASE</version> <scope>test</scope> </dependency>
接着,我们可以在测试方法中使用MockMultipartFile生成一个模拟的上传文件
MockMultipartFile file = new MockMultipartFile("file", "filename.txt", "text/plain", "File content".getBytes());
我们可以看到,构造方法需要指定4个参数。
- 第一个参数:上传文件的名字,即表单中<input>元素的name属性值
- 第二个参数:上传的文件名字
- 第三个参数:上传文件的MediaType(媒体类型)
- 第四个参数:上传文件的byte数组
三、如何测试文件上传功能
一般来说,测试文件上传功能有两种方式:
- 模拟Spring MVC发送multipart/form-data请求
- 使用MockMultipartHttpServletRequest模拟multipart/form-data请求
四、使用MockMvc单元测试文件上传功能
MockMvc是Spring MVC提供的一套测试工具,可以模拟Spring MVC的运行环境,测试我们的Controller的输出结果是否正确。
首先我们需要构造一个MockMvc实例
@RunWith(SpringRunner.class) @SpringBootTest public class FileUploadControllerTest { private MockMvc mvc; @Autowired private WebApplicationContext webApplicationContext; @Before public void setUp() throws Exception { mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } // 测试方法 }
接下来我们可以写一个测试方法,测试文件上传功能是否正确。
@Test public void testUpload() throws Exception { //构造文件上传请求 MvcResult result = mvc.perform(MockMvcRequestBuilders.fileUpload("/upload") .file(new MockMultipartFile("file", "filename.txt", "text/plain", "hello world".getBytes()))) .andExpect(status().isOk()) .andReturn(); //获取响应结果 String content = result.getResponse().getContentAsString(); assertEquals("上传成功", content); }
上面的代码中,我们通过MockMvcRequestBuilders.fileUpload("/upload")构造一个文件上传的请求,通过file()方法上传一个文件。最后按照常规的方式验证返回结果是否正确。
五、使用MockMultipartHttpServletRequest测试文件上传功能
MockMvc测试是模拟了Spring MVC的运行环境,测试效果更真实。但是有时候我们也需要直接测试我们的Service或者Bean层,没有必要模拟整个Spring MVC的运行环境。这个时候我们就可以使用MockMultipartHttpServletRequest,直接构造一个multipart/form-data类型的Request,然后将其传递给Service层进行测试。
@RunWith(SpringRunner.class) @SpringBootTest public class FileUploadServiceTest { @Autowired private FileUploadService service; @Test public void testUpload() throws Exception { //构造文件上传请求 MockHttpServletRequest request = new MockHttpServletRequest(); request.setContentType("multipart/form-data"); MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest(request); MockMultipartFile file = new MockMultipartFile("file", "filename.txt", "text/plain", "hello world".getBytes()); mockRequest.addFile(file); String result = service.upload(mockRequest.getFile("file")); assertEquals("上传成功", result); } }
上面的代码中,我们构造了一个MockHttpServletRequest对象,设置请求类型为multipart/form-data。接着,我们构造了一个MockMultipartHttpServletRequest对象,并添加了一个MockMultipartFile对象作为上传附件。最后,将构造的MockMultipartHttpServletRequest对象传递给了Service层进行测试,也就是service.upload()方法。
六、总结
本文主要介绍了如何使用MockMultipartFile类实现文件上传功能的模拟测试和真正的单元测试。通过这种方式,我们不仅可以在Spring MVC项目中方便地测试文件上传功能,也可以在非Spring MVC项目中测试上传文件的代码是否正常。