我有以下用于保存汽车的请求处理程序。我已经验证了使用cURL时的效果。现在,我想使用Spring MVC Test对方法进行单元测试。我试图使用fileUploader,但是我无法使其正常运行。我也无法添加JSON部分。
如何使用Spring MVC Test对该方法进行单元测试?我无法在此找到任何示例。
@RequestMapping(value = "autos", method = RequestMethod.POST) public ResponseEntity saveAuto( @RequestPart(value = "data") autoResource, @RequestParam(value = "files[]", required = false) List<MultipartFile> files) { // ... }
我想为自己的auto +一个或多个文件添加JSON表示形式。
由于MockMvcRequestBuilders#fileUpload已弃用,因此你将使用MockMvcRequestBuilders#multipart(String, Object...)返回的MockMultipartHttpServletRequestBuilder。然后链接一堆file(MockMultipartFile)calls。
MockMvcRequestBuilders#fileUpload
MockMvcRequestBuilders#multipart(String, Object...)
MockMultipartHttpServletRequestBuilder
file(MockMultipartFile)
这是一个工作示例。给定一个@Controller
@Controller
@Controller public class NewController { @RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public String saveAuto( @RequestPart(value = "json") JsonPojo pojo, @RequestParam(value = "some-random") String random, @RequestParam(value = "data", required = false) List<MultipartFile> files) { System.out.println(random); System.out.println(pojo.getJson()); for (MultipartFile file : files) { System.out.println(file.getOriginalFilename()); } return "success"; } static class JsonPojo { private String json; public String getJson() { return json; } public void setJson(String json) { this.json = json; } } }
and a unit test
@WebAppConfiguration @ContextConfiguration(classes = WebConfig.class) @RunWith(SpringJUnit4ClassRunner.class) public class Example { @Autowired private WebApplicationContext webApplicationContext; @Test public void test() throws Exception { MockMultipartFile firstFile = new MockMultipartFile("data", "filename.txt", "text/plain", "some xml".getBytes()); MockMultipartFile secondFile = new MockMultipartFile("data", "other-file-name.data", "text/plain", "some other type".getBytes()); MockMultipartFile jsonFile = new MockMultipartFile("json", "", "application/json", "{\"json\": \"someValue\"}".getBytes()); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); mockMvc.perform(MockMvcRequestBuilders.multipart("/upload") .file(firstFile) .file(secondFile) .file(jsonFile) .param("some-random", "4")) .andExpect(status().is(200)) .andExpect(content().string("success")); } }
And the @Configuration class
@Configuration
@Configuration @ComponentScan({ "test.controllers" }) @EnableWebMvc public class WebConfig extends WebMvcConfigurationSupport { @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); return multipartResolver; } }
The test should pass and give you output of
4 // from param someValue // from json file filename.txt // from first file other-file-name.data // from second file
需要注意的是,你与其他多部分文件一样发送JSON,但内容类型不同。